Ben Hocking引用的DosTips RTRIM函数可用于创建可以修剪文本文件中每一行的脚本.但是,功能相对较慢.
DosTips用户(和主持人)aGerman开发了一种非常有效的右调整算法.他将算法实现为批处理"宏" - 将复杂的迷你脚本存储在可以从内存执行的环境变量中的有趣概念.带参数的宏本身就是一个主要的讨论话题,与这个问题无关.
我已经提取了一个德国算法并将其放在下面的批处理脚本中.该脚本期望将文本文件的名称作为唯一参数,然后向右调整文件中每行的空格.
@echo off
setlocal enableDelayedExpansion
set "spcs= "
for /l %%n in (1 1 12) do set "spcs=!spcs!!spcs!"
findstr /n "^" "%~1" >"%~1.tmp"
setlocal disableDelayedExpansion
(
for /f "usebackq delims=" %%L in ("%~1.tmp") do (
set "ln=%%L"
setlocal enableDelayedExpansion
set "ln=!ln:*:=!"
set /a "n=4096"
for /l %%i in (1 1 13) do (
if defined ln for %%n in (!n!) do (
if "!ln:~-%%n!"=="!spcs:~-%%n!" set "ln=!ln:~0,-%%n!"
set /a "n/=2"
)
)
echo(!ln!
endlocal
)
) >"%~1"
del "%~1.tmp" 2>nul
Run Code Online (Sandbox Code Playgroud)
假设脚本名为rtrimFile.bat,则可以从命令行调用它,如下所示:
rtrimFile "fileName.txt"
Run Code Online (Sandbox Code Playgroud)
关于性能
的注意事项原始DosTips rtrim函数执行线性搜索,默认修剪最多32个空格.它必须每个空间迭代一次.
aGerman的算法使用二进制搜索,它能够在13次迭代中修剪批量允许的最大字符串大小(最多~8k空间).
不幸的是,在处理文本时,批处理非常慢.即使使用高效的rtrim功能,在我的机器上修剪1MB文件也需要大约70秒.问题是,只需在没有任何修改的情况下读取和写入文件就需要花费大量时间.这个答案使用FOR循环来读取文件,再加上FINDSTR为每行添加行号,以便保留空行.它会切换延迟扩展以防止!被破坏,并使用搜索和替换操作从每行中删除行号前缀.在它开始做rtrim之前所有这一切.
通过使用使用的备用文件读取机制,set /p性能可能几乎翻倍.但是,set/p方法限制为每行约1k字节,并从每行中删除尾随控制字符.
如果您需要定期修剪大型文件,那么即使性能提高一倍也可能不够.是时候下载(如果可能的话)可以在眨眼间处理文件的许多实用程序中的任何一个.
如果您不能使用非本机软件,则可以通过CSCRIPT批处理命令尝试VBScript或JScript.任何一个都会快得多.
更新 - 使用JREPL.BAT快速解决方案
JREPL.BAT是一个正则表达式查找/替换实用程序,可以非常有效地解决问题.它是纯脚本(混合批处理/ JScript),可以在XP以后的任何Windows机器上本机运行.不需要第三方exe文件.
使用JREPL.BAT在PATH中的某个位置,您可以使用以下简单命令从文件"test.txt"中删除尾随空格:
jrepl " +$" "" /f test.txt /o -
Run Code Online (Sandbox Code Playgroud)
如果将命令放在批处理脚本中,则必须在命令前面加上CALL:
call jrepl " +$" "" /f test.txt /o -
Run Code Online (Sandbox Code Playgroud)
去让自己的副本CygWin的或将sed包从的GnuWin32。
然后将其与命令一起使用:
sed "s/ *$//" inputFile >outputFile
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
21773 次 |
| 最近记录: |