代码之家  ›  专栏  ›  技术社区  ›  Ushida

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

  •  2
  • Ushida  · 技术社区  · 7 年前
    @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行

    基本上,我需要能够交换它读取到的数字,一个标签呼叫是首选

    完成代码:

    呼叫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
    

    text-read-lines-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/

    2 回复  |  直到 7 年前
        1
  •  0
  •   Magoo    7 年前
    @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 ing :gate 程序设置或清除 record 指定行是否在 counter 是否应记录。 if defined 处理目标变量的当前状态-定义与否。

    这个 :闸门 例行检查 字符串,赋值 %%x 对于第一个令牌, %%y 到第二个和 %%z 提供的其余参数。如果当前行号在 %1 (来自调用循环)大于第二个参数,然后赋值 绳子的其余部分 (删除前两个参数)并重试。 帕尔姆斯 最终将变为空,所以不要尝试处理它。

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

    这么说吧 params 10 13 21 28 . %%x 将设置为 10 , %%y 13 %%z 21 28 . 在第9行之前,行号不会 geq 10,所以 记录 保持清晰。对于第10至13行, 记录 将设置和记录行,在第14行,14大于13,所以 帕尔姆斯 变成 21 28 我们再试一次。

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

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


    例如

    如果数据文件包含

    第1行

    第3行
    第4行
    第5行


    第8行

    3 5 表示“第3行至第5行(含第3行至第5行)”,然后从

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

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

    (注意每一行都有其 起初的 线路编号。

    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. 第4行
    3. 第5行

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

    如果你离开 二者都

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

    也就是说,第一个输出与第二个输出串联。

        2
  •  0
  •   Quanmao    7 年前

    希望 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工具,在Windows和Linux上不依赖文件/管道文本处理 my open project . 查看文档,如 peformance comparision with grep and findstr built-in usage doc by running exe file line range