Board logo

标题: [文本处理] 批处理for循环快速计算数目可否有更快方法? [打印本页]

作者: delab-1    时间: 2024-9-18 12:02     标题: 批处理for循环快速计算数目可否有更快方法?

各位大神,有一个初级但是较为困惑的问题请教大家。我在多个文件中,需要算其所包含文本行的个数,我利用如下循环语句,计算其行数(numb):
  1. setlocal enabledelayedexpansion
  2. set /a numb=0
  3. for /f %%c in (std_map_expt_HS2.txt) do (set /a numb+=1)
复制代码
因为这个计算过程需要一个一个查找文本行,在文件较大时需要较长时间的耗时,特别是多文件重复上述计算时,消耗的时间太长。

我请教大家,在这种情况下有没有减少计算时间的方法?
作者: qixiaobin0715    时间: 2024-9-18 12:08

  1. find /v /c "" std_map_expt_HS2.txt
复制代码

作者: qixiaobin0715    时间: 2024-9-18 15:44

多文件统计总行数:
  1. type *.txt 2>nul|find /v /c ""
复制代码

作者: delab-1    时间: 2024-9-18 17:04

回复 2# qixiaobin0715


    太感谢了,效率大幅度提高 :handshake
作者: delab-1    时间: 2024-9-18 17:08

回复 3# qixiaobin0715


    type *.txt 2>nul|find /v /c ""
这个写法非常高效,我也运行成功了 ,但是为何要在type *.txt后面加个2?可否帮助解释一下?另外,我也试过了,如果不加2,输出的结果为零,是错误的。
作者: qixiaobin0715    时间: 2024-9-18 17:13

主要是屏蔽多余的显示内容,你可以把2>nul去掉试试。
作者: delab-1    时间: 2024-9-18 17:28

回复 6# qixiaobin0715


非常感谢,已经测试了,去掉2>null后不影响运行,而且结果也是正确的。完美的是,这个写法只显示单独的数据值,非常干净。
例如,如果写程序为:find /v /c STD_MAP_EXPORT_HS2.TXT >temp.txt 输出结果为---------- STD_MAP_EXPORT_HS2.TXT: 7819
        如果写type STD_MAP_EXPORT_HS2.TXT|find /v /c "" 输出结果为7819。

第二个输出格式对于后续处理很方便,避免了取值和去掉空格等问题。
作者: Batcher    时间: 2024-9-18 20:22

回复 1# delab-1


参考:
http://bbs.bathome.net/thread-474-2-1.html#pid28474
作者: 77七    时间: 2024-9-18 21:22

  1. @echo off
  2. cd /d "%~dp0"
  3. for %%i in (*.txt) do (
  4. for /f %%a in ('find /c /v "" ^< "%%i"') do (
  5. echo %%i %%a
  6. set /a n+=%%a
  7. )
  8. )
  9. echo %n%
  10. pause
复制代码

作者: delab-1    时间: 2024-9-19 12:24

回复 9# 77七


太感谢了,非常完美的程序! :handshake
另外,可否稍微讲一下^<和<在使用的差异和注意事项么?是不是^<用在For命令中,而<可以用在其他非for情况,我做了测试,似乎是我估计的这样。
作者: 77七    时间: 2024-9-19 13:04

回复 10# delab-1



应该和预处理有关,以下代码举个例子,比如不写^,整个语句就会被分割。
for /f "delims=" %%a in ('type *.txt | find "abc"') do echo %%a


先执行
  1. for /f "delims=" %%a in ('type *.txt
复制代码

for /f 是特定的语句,现在不完整了,代码会闪退


有兴趣深入了解可以参考:
批处理文章:预处理、变量延迟、call
for /f 与 cmd /c 的 command 处理
作者: delab-1    时间: 2024-9-20 10:02

回复 11# 77七


    太感谢了,非常有帮助! :handshake
作者: delab-1    时间: 2024-9-20 10:03

回复 8# Batcher


    谢谢楼主,我正在努力学习中,非常感谢 :handshake
作者: Five66    时间: 2024-9-21 13:07

find /v /c ""
貌似末尾有连续空行时会少算一行




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2