Batch file 使用for循环在一个范围内标记并排序
我的问题是:我有一个Batch file 使用for循环在一个范围内标记并排序,batch-file,Batch File,我的问题是:我有一个.txt字符串文件,我想在1到4之间对其进行排序和标记。删除3和4时,我只想保留项目1和2。我知道我可以使用%4在删除2和3时保留0和1标记化项,但问题是在调制时使用if语句,并在整个文件中执行该操作。文件大小将至少为5000/n行长 这是我迄今为止最成功的代码。我使用代码I作为基础 @echo on for /f "tokens=*" %%a in ('findstr /n .* "C:\...\TEXTFILE.txt"') do
.txt
字符串文件,我想在1到4之间对其进行排序和标记。删除3和4时,我只想保留项目1和2。我知道我可以使用%4
在删除2和3时保留0和1标记化项,但问题是在调制时使用if语句,并在整个文件中执行该操作。文件大小将至少为5000/n行长
这是我迄今为止最成功的代码。我使用代码I作为基础
@echo on
for /f "tokens=*" %%a in ('findstr /n .* "C:\...\TEXTFILE.txt"') do (
set "FullLine=%%a"
for /f "tokens=1* delims=:" %%b in ("%%a") do (
setlocal enabledelayedexpansion
set "LineData=!FullLine:*:=!"
set /a MODVAR = %%b%%2
if %%b == !MODVAR! >"TEXTFILE.txt" echo(!LineData!
endlocal
)
)
pause
这将仅替换第1行中的文本。我知道我说过我想要第1行和第2行,但我想我会使用else
语句来获得第二行。在我尝试这个问题之前,只需要使用当前代码就可以了
我已经读到使用正则表达式查找和替换会更容易,但是我更喜欢使用批处理来找到解决方案,这样我就可以编写(获取)当前代码并完成。而不是复制/粘贴可能多次
编辑:我的初始文本文档的一个示例是:
aaa
bbb
ccc
ddd
eee
(以此类推)我只想保留aaa、bbb和eee,我只关注您给出的第
3行和第4行的示例
根据您的示例,在单个文件上:
@echo off
setlocal enabledelayedexpansion
set "file=C:\...\TEXTFILE.txt"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
set "line=%%f"
if "!line:~0,3!" == "[3]" set "line="
if "!line:~0,3!" == "[4]" set "line="
if defined line set "line=!line:*]=!"
if defined line echo(!line!)>>"!file!"
)
或者循环浏览所有.txt
文件,并删除3
和4
@echo off
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
set "file=%%~i"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
set "line=%%f"
if "!line:~0,3!" == "[3]" set "line="
if "!line:~0,3!" == "[4]" set "line="
if defined line set "line=!line:*]=!"
if defined line echo(!line!)>>"!file!"
)
)
为了理解发生了什么:我们在文件中键入,使用括号中的find/v/n
添加行号。i、 e每行将附加行的开头[1]
,[2]
等
然后我们进行匹配,查看前3个字符是否匹配[3]
或[4]
如果匹配,请清除变量。然后我们只需每次测试变量是否已定义,如果未定义(对于第3行和第4行),我们只需跳过echo
ing这些行
因此,请给出以下示例:
aaa
bbb
ccc
ddd
eee
我之前键入文件,要查看内容,请运行批处理文件
,然后再次键入文件以查看结果:
我只关注您给出的第3行和第4行的示例
根据您的示例,在单个文件上:
@echo off
setlocal enabledelayedexpansion
set "file=C:\...\TEXTFILE.txt"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
set "line=%%f"
if "!line:~0,3!" == "[3]" set "line="
if "!line:~0,3!" == "[4]" set "line="
if defined line set "line=!line:*]=!"
if defined line echo(!line!)>>"!file!"
)
或者循环浏览所有.txt
文件,并删除3
和4
@echo off
setlocal enabledelayedexpansion
for %%i in (*.txt) do (
set "file=%%~i"
for /f "tokens=*" %%f in ('type "!file!" ^| find /v /n "" ^& break ^> "!file!"') do (
set "line=%%f"
if "!line:~0,3!" == "[3]" set "line="
if "!line:~0,3!" == "[4]" set "line="
if defined line set "line=!line:*]=!"
if defined line echo(!line!)>>"!file!"
)
)
为了理解发生了什么:我们在文件中键入,使用括号中的find/v/n
添加行号。i、 e每行将附加行的开头[1]
,[2]
等
然后我们进行匹配,查看前3个字符是否匹配[3]
或[4]
如果匹配,请清除变量。然后我们只需每次测试变量是否已定义,如果未定义(对于第3行和第4行),我们只需跳过echo
ing这些行
因此,请给出以下示例:
aaa
bbb
ccc
ddd
eee
我之前键入文件,要查看内容,请运行批处理文件
,然后再次键入文件以查看结果:
如果你想“每n行”,模是很好的选择。特别是对于“take two,skip two”,有一种更好的方法(逻辑位AND)
我还将整个输出一次性放入输出文件。这比为每行打开文件、写入文件并再次关闭文件要快得多
拆下REM进行故障排除。它向您展示了modvar
的具体情况
(注意:只有当N
是二的幂(1,2,4,8,16,…)时,此方法才适用于“取N,跳过N”)
为了完整起见,以下是如何使用模运算:
@echo off
setlocal enabledelayedexpansion
(for /f "tokens=1* delims=:" %%i in ('findstr /n "^" in.txt') do (
set /a "modvar=(%%i-1) %% 4"
REM echo %%i, !modvar!, %%j >con
if !modvar! lss 2 echo(%%j
))>out.txt
如果你想要“每n行”,模是很棒的。特别是对于“take two,skip two”,有一种更好的方法(逻辑位AND)
我还将整个输出一次性放入输出文件。这比为每行打开文件、写入文件并再次关闭文件要快得多
拆下REM进行故障排除。它向您展示了modvar
的具体情况
(注意:只有当N
是二的幂(1,2,4,8,16,…)时,此方法才适用于“取N,跳过N”)
为了完整起见,以下是如何使用模运算:
@echo off
setlocal enabledelayedexpansion
(for /f "tokens=1* delims=:" %%i in ('findstr /n "^" in.txt') do (
set /a "modvar=(%%i-1) %% 4"
REM echo %%i, !modvar!, %%j >con
if !modvar! lss 2 echo(%%j
))>out.txt
从您对实际任务的描述中,我不能完全确定,因此这是我对它的阅读,您的意图是将文件中的行重新创建为另一行,但省略了3
和4
这里有一种可能性,取决于是否必须保留选项卡:
@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
从您对实际任务的描述中,我不能完全确定,因此这是我对它的阅读,您的意图是将文件中的行重新创建为另一行,但省略了3
和4
这里有一种可能性,取决于是否必须保留选项卡:
@Echo关闭
SetLocal EnableExtensions DisableDelayedExpansion
好的,我更喜欢看一个实际的用例,换句话说,显示输入的示例,并演示预期的输出结果。不清楚您的输入文本文件是什么样子的,请显示一个示例。复制的代码仅用于按行号选择单行。但是零件set/a ccc=%%b%%2
看起来很奇怪。顺便说一句,您将endlocal
放置在错误的位置place@jeb,是的,我同意,这是一种将值设置为1的奇怪方法。@Gerhard我编辑了endlocal,以及set/a变量,以避免在示例中混淆。我这样做的原因是因为我试图在if语句中简化模的使用,因为我找不到其他解决方法。我仍然不确定,我理解你的意思。是“两行,忽略两行,忽略两行,忽略两行…等等”吗?好吧,我更喜欢看一个实际的用例,换句话说,显示输入的示例和预期的输出结果。不清楚您的输入文本文件是什么样子的,请显示一个示例。复制的代码仅用于按行号选择单行。但零件set/a ccc