需要从批处理文件中的第a行到第b行读取

时间:2017-10-16 01:41:27

标签: batch-file

@echo off
cls
Color 0A

:Read
setlocal EnableDelayedExpansion
set file=WinSCP-5.11.2-ReadMe.txt
call :ReadInLines
call :EchoLines

echo insert other code here
pause
endlocal
(goto) 2>nul

:ReadInLines
set Counter=0
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1
    title Lines In File: !Counter!
    set "Line_!Counter!=%%i"
)
(goto) 2>nul

:EchoLines
For /L %%C in (1,1,%Counter%) Do (echo %%C. !Line_%%C!)
pause

所以这是我目前的代码

它能够成功地读取和输出整个文件但我希望以不需要滚动的方式工作(对于更大的文件)

基本上我需要做的是读取一定数量的行

示例:

读取第1到8行,但也读取第5到13行

基本上我需要能够交换它读取的数字,要调用的标签是首选

完成代码:

call.bat:

@echo off
cls
Color 0A

:: double call
call text-read-lines-alt.bat 1 8
call text-read-lines-alt.bat 9 20
pause

:: multiselect (a) (b) (a) (b) etc...
call text-read-lines-alt.bat 1 20 23 29
pause

:: call then calling outside text range (outputs first but not second)
call text-read-lines-alt.bat 1 8
call text-read-lines-alt.bat 80 100
pause

:: another call outside text range (outputs nothing)
call text-read-lines-alt.bat 90 100
pause

文本读取线-alt.bat:

@echo off
setlocal EnableDelayedExpansion
set file=WinSCP-5.11.2-ReadMe.txt

SET "parms=%*"

call :ReadInLines
call :EchoLines

echo insert other code here
endlocal
(goto) 2>nul

:ReadInLines
set Counter=0
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1
    title Lines In File: !Counter!

    CALL :gate !counter!

    IF DEFINED RECORD set "Line_!Counter!=%%i"
)
(goto) 2>nul

:EchoLines
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!)
GOTO :EOF

:gate
SET "record="
IF NOT DEFINED parms GOTO :EOF 
FOR /f "tokens=1,2*" %%x IN ("%parms%") DO (
    IF %1 gtr %%y SET "parms=%%z"&GOTO gate
    IF %1 geq %%x SET "record=Y"
)
GOTO :EOF

以下是所有辛勤工作的内容:http://old-school-gamer.tk/batch/text-reader/releases/ :d

2 个答案:

答案 0 :(得分:0)

希望msr.exe可以帮助您进行此类文件处理。

msr -p file-paths -L begin-line -N end-line -PAC隐藏路径/信息/颜色。

但一次不能读取2个范围(read lines 1 to 8 but also read lines 5 to 13):

msr -p test.txt -L 1 -N 8 + msr -p text.txt -L 5 -N 13

见下面的截图。

msr.exe / msr.gcc*是一个大约1.5MB的单个exe工具,在my open project的Windows和Linux上没有文件/管道文本处理的依赖关系。查看peformance comparision with grep and findstrbuilt-in usage doc by running exe等文档。 file line range

答案 1 :(得分:0)

@ECHO OFF
setlocal EnableDelayedExpansion
set file=WinSCP-5.11.2-ReadMe.txt
set file=100lines.txt

SET "parms=%*"

call :ReadInLines
call :EchoLines

echo insert other code here
pause
endlocal
(goto) 2>nul

:ReadInLines
set Counter=0
for /f "DELIMS=" %%i in ('type %file%') do (
    set /a Counter+=1
    title Lines In File: !Counter!

    CALL :gate !counter!

    IF DEFINED RECORD set "Line_!Counter!=%%i"
)
(goto) 2>nul

:EchoLines
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!)
SET /a count=0
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (
 SET /a count +=1
 echo !count!. !Line_%%C!
)
GOTO :EOF

:gate
SET "record="
IF NOT DEFINED parms GOTO :EOF 
FOR /f "tokens=1,2*" %%x IN ("%parms%") DO (
 IF %1 gtr %%y SET "parms=%%z"&GOTO gate
 IF %1 geq %%x SET "record=Y"
)
GOTO :EOF

我开始记录parms =命令尾。我的100lines.txt文件只是一个包含100行的文件"第1行" .."第100行"

CALL :gate程序设置或清除record以指定是否应记录counter中的行。 if defined适用于目标变量的当前状态 - 已定义与否。

:gate例程检查parms字符串,将%%x分配给第一个标记,%%y分配给第二个标记,%%z分配给其余参数提供。如果%1(来自调用循环)中的当前行号大于第二个参数,则将parms分配给字符串的其余部分(这将删除前两个参数) 然后再试一次。 parms最终会变空,所以根本不要尝试处理它。

如果第二个参数不大于当前行,请查看当前行是否大于或等于第一个参数。如果是这样,请将record设置为一个值,使其成为已定义,因此调用循环将记录它。

所以 - 说params10 13 21 28%%x将设置为10%%y设置为13%%z设置为21 28。在第9行之前,行号不会是geq 10,因此record仍然清晰。对于第10行到第13行,record将被设置,第14行,第14行记录的行数大于13,因此parms变为21 28,我们会再次尝试。

我也修改了输出程序。如果if defined已定义,则echo门只会执行line_%%C,因此不会有空行。缺点是报告将显示文件中的行号。

第二个过程使用一种相当明显的方法来序列化输出以产生行号。

例如,

如果数据文件包含

  

第1行   第2行   3号线   第4行   5号线   6号线   7号线   第8行

然后,如果提供的参数是3 5含义"第3行到第5行,包括"

的输出
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (echo %%C. !Line_%%C!)

将是

  
      
  1. 第3行
  2.   
  3. 第4行
  4.   
  5. 第5行
  6.   

(注意每一行都有原始行号。

的输出
SET /a count=0
For /L %%C in (1,1,%Counter%) Do IF DEFINED line_%%C (
 SET /a count +=1
 echo !count!. !Line_%%C!
)

将是

  
      
  1. 第3行
  2.   
  3. 第4行
  4.   
  5. 第5行
  6.   

(只是相同的数据,但修改了行号)

如果你将这些输出机制的两个放在适当的位置,输出将是

  
      
  1. 第3行
  2.   
  3. 第4行
  4.   
  5. 第5行
  6.   
  7. 第3行
  8.   
  9. 第4行
  10.   
  11. 第5行
  12.   

即第一个输出与第二个输出连接。