2014-04-30 40 views
1

下午好!分割文本文件时应对循环批处理文件问题

长时间读者,第一次海报!我一直在尝试修改一个工作批处理文件以应对可变性问题,这段时间一直很愉快。情况是,我有一个可变大小的文本文档,通常可以分成252行的部分。下面的代码工作就像一个冠军:

@echo off & setlocal EnableDelayedExpansion 

set param=%* 
if not defined param (
    echo. 
    echo. Usage: batchsplit [device:][pathname]filename 
    goto :EOF 
) 
set param=%param:"=% 
if not exist "%param%" (
    echo. 
    echo. File "%param%" not found 
    goto :EOF 
) 
for %%j in ("%param%") do (
    set name=%%~dpnj 
    set ext=%%~xj 
) 
for /F %%j in ('type "%param%" ^| find /V /C ""') do set Full=%%j 
set /A Split=%Full%/252 
for /L %%G in (1,1,%Split%) do type nul > "%name%_%%G%.new" 
set X=1 
set N=1 
set Q=1 
set limit = 252 
for /F "tokens=1* delims=]" %%j in ('type "%param%" ^| find /V /N ""') do (
    set /A N+=1 
    set /A Q+=1 
    echo.%%k>> "%name%_!X!%.new" 
    if !Q! gtr 252 (
    set /A X+=1 
    set /A Q=1 
) else if !N! gtr Full (goto theend 
) 
) 
:theend 
echo split into %split% files with 252 lines each 
rem pause 

然而,有一些改变文本的格式,而现在不是四页的每个分割文件63行,也可以是完全可变的。唯一的常数是这样的最后一行,这之前为一个63行页面的剩余空间:

ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________ 

注意,有在其前面的单个空间,以及多个空格,冒号和下划线字符。作为我的头号人物,我想我可以在for循环中插入一个if-then语句来触发批处理以分割到下一页。不过,我现在可以远离这一点。这是我一直在砸我的头代码:

rem @echo off & setlocal EnableDelayedExpansion 
setlocal EnableDelayedExpansion 

set param=%* 
if not defined param (
    echo. 
    echo. Usage: textsplit [device:][pathname]filename 
    goto :EOF 
) 
set param=%param:"=% 
if not exist "%param%" (
    echo. 
    echo. File "%param%" not found 
    goto :EOF 
) 
for %%j in ("%param%") do (
    set Name=%%~dpnj 
    set ext=%%~xj 
) 
for /F %%j in ('type "%param%" ^| find /V /C ""') do set Full=%%j 
set stopvar= ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________ 
set Split=1 
echo %stopvar% 
set X=1 
type nul > "%name%_!X!%.new" 
set N=1 
set Q=1 
set S=0 
set L=63 
for /F "tokens=1* delims=]" %%j in ('type "%param%" ^| find /V /N ""') do (
    set /A N+=1 
    echo %N% 
    set /A Q+=1 
    echo %Q% 
    echo.%%k>> "%name%_!X!%.new" 
    if ["%%k%" == "!stopvar!"] (
    set /A S+=1 
    ) 

    if !Q! gtr !L! (
    if !S! == 1 (
    set /A X+=1 
     set /A Q=1 
type nul > "%name%_!X!%.new" 
set /A Split+=1 
set S=0 
    ) 
     else set /A L+=63 
     else if !N! gtr Full goto theend 

) 
:theend 
echo Split into %split% files! 
pause 

的前提是,每63线,停止变量(S)被选中。如果它关闭(0),则该批次将继续写入另外63行(一页)。如果stopvar与for循环所读取的行相匹配,则S变为1.当程序再次检查时,它将创建一个新文件并开始写入新文件。现在,基于关闭@echo关闭hangup在for循环。见下:

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>rrtextsplit texttest.txt 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>rem @echo off & setlocal Enabl 
eDelayedExpansion 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>setlocal EnableDelayedExpansio 
n 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set param=texttest.txt 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>if not defined param (
echo. 
echo. Usage: rrtextsplit [device:][pathname]filename 
goto :EOF 
) 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set param=texttest.txt 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>if not exist "texttest.txt" (
echo. 
echo. File "texttest.txt" not found 
goto :EOF 
) 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>for %j in ("texttest.txt") do 
(
set Name=%~dpnj 
set ext=%~xj 
) 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>(
set Name=C:\Users\theangryasiancp\Desktop\TEXT_Split_Test\texttest 
set ext=.txt 
) 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>for /F %j in ('type "texttest. 
txt" | find /V /C ""') do set Full=%j 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set Full=567 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set stopvar= ON THIS FORM IS C 
OMPLETE AND CORRECT AS NOTED:___________________ 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set Split=1 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>echo ON THIS FORM IS COMPLETE 
AND CORRECT AS NOTED:___________________ 
ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________ 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set X=1 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>type nul 1>"C:\Users\theangry 
asiancp\Desktop\RRRR_Split_Test\texttest_!X!.new" 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set N=1 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set Q=1 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set S=0 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test>set L=63 

C:\Users\theangryasiancp\Desktop\TEXT_Split_Test> 

你的想法是什么?我在哪里出错了?我希望我可以使用不同的东西,但是由于公司内部的原因,我不能。谢谢你的帮助!

回答

0
@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
SET "name=q23396663" 
SET "ext=.txt" 
SET /a pagelength=10 
SET "targetstring= ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________" 
SET /a filenum=0 
SET /a linecount=pagelength + 1 
FOR /f "tokens=1*delims=]" %%a IN (
'find /v /n "" "%name%%ext%"') DO (
IF !linecount! GEQ %pagelength% (
    SET /a linecount=0 
    SET /a filenum+=1 
) 
>>U:\%name%_!filenum!.new ECHO(%%b 
IF "%%b"=="%targetstring%" SET /a linecount=pagelength 
SET /a linecount+=1 
) 

GOTO :EOF 

出于测试目的,我建立了一个包含触发数据的文件q23396663.txt。我已经离开目标目录U:\适合我,页长10,这使我的测试更容易。

+0

该解决方案完美地满足了我的要求。在实现批处理时,我意识到我需要它继续到页面末尾生成输出的“最后一行”,因为我正在操作的输出文件将剩余的空白空间插入到以下分割文件的顶部。我为此创建了一个解决方案,我将“回答我自己的问题”。非常感谢您的解决方案,因为它有助于指导我前进。 – angryasianguy

0
@echo off 
setlocal EnableDelayedExpansion 


REM ------------------THIS SECTION SPECIFIES THE FILE------------------------- 

set param=%* 
if not defined param (
    echo. 
    echo. Usage: filesplit [device:][pathname]filename 
    goto :EOF 
) 
set param=%param:"=% 
if not exist "%param%" (
    echo. 
    echo. File "%param%" not found 
    GOTO :EOF 
) 
for %%j in ("%param%") do (
    set name=%%~dpnj 
    set ext=%%~xj 
) 

ECHO SPLITTING %name%.%ext% ................. 

REM ----------------THIS SECTION SETS THE VARIABLES--------------------------- 

set "trigger= ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________" 
set /a pagelength=63 
set /a filenum=0 
set split=1 
set /a linecount=pagelength 
set stopvar=0 

REM ------------------THIS SECTION IS THE FOR LOOP---------------------------- 

FOR /f "skip=2 tokens=1* delims=]" %%a IN (
'find /v /n "" "%name%%ext%"') DO (
     SET /a linecount-=1 
IF !linecount! LEQ 0 (
IF !stopvar! EQU 1 (
SET /a "linecount=pagelength" 
SET /a filenum+=1 
SET /a split+=1 
SET /a stopvar-=1 
) else set /a "linecount=pagelength" 
) 
    echo.%%b>> "%name%_!filenum!.new" 
IF "%%b"=="%trigger%" (
    set /a "stopvar+=1" 
           REM THIS TRIGGERS TO CHANGE OUTPUT 
    set /a linecount+=1 
           REM THIS WILL ADJUST THE OUTPUT EOF 
    ) 
) 

REM ----------------THIS SECTION ENDS THE FOR LOOP---------------------------- 


ECHO Split into %split% files! 
ping 1.1.1.1 -n 1 -w 2500 > nul 
            REM THIS PAUSES THE BATCH FOR A SEC 

正如我贴在上面的评论,这仅仅是一个,如果需要,他们从具有顶部不必要的空格保持输出文件占空格第一个答案的变化。当打印管理器在开始下一部分之前直到页面结束时才吐出空白,而不是直接进入下一部分时,这是特别有用的。