@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
答案 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 findstr和built-in usage doc by running exe等文档。
答案 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
设置为一个值,使其成为已定义,因此调用循环将记录它。
所以 - 说params
是10 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!)
将是
- 第3行
- 第4行
- 第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!
)
将是
- 第3行
- 第4行
- 第5行
醇>
(只是相同的数据,但修改了行号)
如果你将这些输出机制的两个放在适当的位置,输出将是
- 第3行
- 第4行
- 第5行
- 第3行
- 第4行
- 第5行
醇>
即第一个输出与第二个输出连接。