去了几个stackoverflow页面,似乎无法得到正确的答案。
我在txt文件中每行都有以下数据。
0320024 |CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105 |KK1-39 |21-AUG-17|NEW |PIECE
如何使用批处理脚本处理txt文件,以便按行显示结果?
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE
我已尝试以下方法来阅读txt文件的行
for /F "tokens=*" %%A in (filename.txt) do [process] %%A
感谢任何帮助,谢谢!
答案 0 :(得分:1)
最简单的方法是使用REPL.BAT编写的Dave Benham。
type "input.txt" | repl.bat "[ \t]+(?:(\|)|$)" "$1" >"output.csv"
搜索正则表达式[ \t]+(?:(\|)|$)
表示:
[ \t]+
...找到1个或多个空格或水平制表符。
(?:
... )
...此组内OR表达式的非标记/捕获组。
(\|)|$
...找到一个文字解释的管道字符并捕获此字符,如果真的找到了OR行结尾而没有匹配换行符。
替换正则表达式$1
引用找到的管道字符(如果搜索表达式找到了管道字符)。
换句话说,这个正则表达式在管道字符中找到1个或多个空格或制表符并删除这些空格或在行尾找到尾随空格/制表符并删除它们。
使用下一个命令move /Y "output.csv" "input.txt"
用生成的输出文件覆盖输入文件。
当然也可以使用JREPL.BAT编写的Dave Benham的最新版本。
将输出写入output.csv
:
jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o "output.csv"
直接替换输入文件:
jrepl.bat "[ \t]+(?:(\|)|$)" "$1" /f "input.txt" /o -
当您需要执行更多操作时,必须使用命令 CALL 来调用repl.bat
或jrepl.bat
,因此在批处理文件中使用这些命令行。在这种情况下,我建议使用而不仅仅是repl.bat
或jrepl.bat
:
... call "%~dp0repl.bat" ...
call "%~dp0jrepl.bat" ...
现在使用批处理文件的完整路径调用替换操作的批处理文件。 repl.bat
或jrepl.bat
必须存储在批处理文件的目录中。那么运行批处理文件的当前目录是什么并不重要。
更好的是使用搜索正则表达式字符串[ \t]+(?=\||$)
,它使用lookahead expression中的OR表达式,仅当下一个字符是管道时才为1个或多个空格/制表符产生正匹配字符或空格/制表符位于行尾。在这种情况下,替换字符串只是一个空字符串,因为只有空格/制表符与搜索字符串匹配。
示例:
call "%~dp0jrepl.bat" "[ \t]+(?=\||$)" "" /f "input.txt" /o -
答案 1 :(得分:1)
acting--
后面的一个空格)(?<!-)
和一个积极的前瞻\s+(?=\|)
包含PowerShell上的Windows 7,所以这应该
powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\|)'|sc NewName.txt"
Get-Content
和sc的别名,您猜对了,Set-Content
> type NewName.txt
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE
powershell -Nop -C "(gc .\filename.txt) -replace '(?<!-) \s+(?=\||$)'|sc NewName.txt"
改变了积极的前瞻,也检查了
行结尾$
,文字|
后面有\|
(从Mofi偷来的; - )
> type NewName.txt
0320024|CYLINDER, TWISTLOCK, DOUBLE ACTING-- |385508-105|KK1-39|21-AUG-17|NEW|PIECE