找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 18762|回复: 13

[文本处理] 批处理for循环快速计算数目可否有更快方法?

[复制链接]
发表于 2024-9-18 12:02:46 | 显示全部楼层 |阅读模式
各位大神,有一个初级但是较为困惑的问题请教大家。我在多个文件中,需要算其所包含文本行的个数,我利用如下循环语句,计算其行数(numb):
  1. setlocal enabledelayedexpansion
  2. set /a numb=0
  3. for /f %%c in (std_map_expt_HS2.txt) do (set /a numb+=1)
复制代码
因为这个计算过程需要一个一个查找文本行,在文件较大时需要较长时间的耗时,特别是多文件重复上述计算时,消耗的时间太长。

我请教大家,在这种情况下有没有减少计算时间的方法?
发表于 2024-9-18 12:08:21 | 显示全部楼层
  1. find /v /c "" std_map_expt_HS2.txt
复制代码
发表于 2024-9-18 15:44:30 | 显示全部楼层
多文件统计总行数:
  1. type *.txt 2>nul|find /v /c ""
复制代码
 楼主| 发表于 2024-9-18 17:04:06 | 显示全部楼层
回复 2# qixiaobin0715


    太感谢了,效率大幅度提高 :handshake
 楼主| 发表于 2024-9-18 17:08:50 | 显示全部楼层
回复 3# qixiaobin0715


    type *.txt 2>nul|find /v /c ""
这个写法非常高效,我也运行成功了 ,但是为何要在type *.txt后面加个2?可否帮助解释一下?另外,我也试过了,如果不加2,输出的结果为零,是错误的。
发表于 2024-9-18 17:13:13 | 显示全部楼层
主要是屏蔽多余的显示内容,你可以把2>nul去掉试试。
 楼主| 发表于 2024-9-18 17:28: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。

第二个输出格式对于后续处理很方便,避免了取值和去掉空格等问题。
发表于 2024-9-18 20:22:14 | 显示全部楼层
发表于 2024-9-18 21:22:21 | 显示全部楼层
  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
复制代码
 楼主| 发表于 2024-9-19 12:24:16 | 显示全部楼层
回复 9# 77七


太感谢了,非常完美的程序! :handshake
另外,可否稍微讲一下^<和<在使用的差异和注意事项么?是不是^<用在For命令中,而<可以用在其他非for情况,我做了测试,似乎是我估计的这样。
发表于 2024-9-19 13:04:20 | 显示全部楼层
回复 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 处理
 楼主| 发表于 2024-9-20 10:02:58 | 显示全部楼层
回复 11# 77七


    太感谢了,非常有帮助! :handshake
 楼主| 发表于 2024-9-20 10:03:29 | 显示全部楼层
回复 8# Batcher


    谢谢楼主,我正在努力学习中,非常感谢 :handshake
发表于 2024-9-21 13:07:58 | 显示全部楼层
find /v /c ""
貌似末尾有连续空行时会少算一行

评分

参与人数 1技术 +1 收起 理由
77七 + 1 感谢分享

查看全部评分

您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 18:18 , Processed in 0.023047 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表