Question

Good Afternoon!

Long time reader, first time poster! I have been having a lovely time trying to modify a working batch file to account for variability. The situation is that I have a variable-size text document that normally would be able to be split into sections of 252 lines. The code below worked like a champ:

@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

However, there were some changes to the formatting of the text, and now instead of four pages of 63 lines per split file, it can be completely variable. The only constant is this final line, which precedes the remaining space for a 63 line page:

 ON THIS FORM IS COMPLETE AND CORRECT AS NOTED:___________________

Note that there is a single space in front of it, as well as multiple spaces, a colon, and underscore characters. Being the meathead that I am, I thought I could insert an if-then statement into the for loop to trigger the batch to split to the next page. However, I could be further from that right now. This is the code I have been smashing my head with:

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

The premise is that every 63 lines, the stop variable (S) is checked. If it is off (0) then the batch will continue to write for another 63 lines (one page). If the stopvar matches the line that is being read by the for loop, S becomes 1. When the program checks again, it will create a new file and begin writing to that new file. Right now, based on turning off @echo off the hangup is at the for loop. See below:

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>

What are your thoughts? Where am I going wrong with the batch? I wish I could use something different, but alas I cannot, for internal company reasons. Thanks for your help!

Was it helpful?

Solution

@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

For testing purposes, I set up a file q23396663.txt containing your trigger data. I've left the destination directory as U:\ which suits me, and the pagelength at 10 which makes my testing easier.

OTHER TIPS

@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

As I posted in the comment above, this is just a variation of the first answer that accounts for blank spaces if they are needed to keep the output files from having unnecessary whitespace on top. This is especially helpful when a print manager is just spitting out whitespace until the end of the page before starting the next part instead of going straight to the next portion.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top