[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理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)
复制代码
因为这个计算过程需要一个一个查找文本行,在文件较大时需要较长时间的耗时,特别是多文件重复上述计算时,消耗的时间太长。

我请教大家,在这种情况下有没有减少计算时间的方法?

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

TOP

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

TOP

回复 2# qixiaobin0715


    太感谢了,效率大幅度提高 :handshake

TOP

回复 3# qixiaobin0715


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

TOP

主要是屏蔽多余的显示内容,你可以把2>nul去掉试试。

TOP

回复 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。

第二个输出格式对于后续处理很方便,避免了取值和去掉空格等问题。

TOP

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  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
复制代码
bat小白,请多指教!谢谢!

TOP

回复 9# 77七


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

TOP

回复 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 处理
bat小白,请多指教!谢谢!

TOP

回复 11# 77七


    太感谢了,非常有帮助! :handshake

TOP

回复 8# Batcher


    谢谢楼主,我正在努力学习中,非常感谢 :handshake

TOP

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

评分人数

    • 77七: 感谢分享技术 + 1

TOP

返回列表