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

[文本处理] 【已解决】批处理变量延迟的表述是否可以优化?

[复制链接]
发表于 2023-4-14 01:11:52 | 显示全部楼层 |阅读模式
本帖最后由 思想之翼 于 2023-4-14 13:42 编辑

下述代码,用于提取出现最多次数的字符。
在原代码基础上,加了循环语句,故而出现2处变量延迟。
代码非循环运行,耗时大约80毫秒,对于只有1列10行左右数据的文本,似乎耗时过多。
该代码多线程并行运行时,似乎并不能发挥多物理核心的优势,CPU始终只占9%
故而产生能否优化的想法。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%f in (101,1,121) do (
  4.     set p=%%f
  5.     for /l %%g in (1000001,1,1100000) do (
  6.         set m=%%g
  7. cd /d "e:\JZ\!p:~1!\!m:~1!"
  8. for %%i in (*.txt) do (
  9.     setlocal enabledelayedexpansion
  10.     for /f "delims=" %%a in (%%i) do (
  11.         for %%b in (%%a) do (
  12.             set/a #%%b+=1
  13.             if !#%%b! gtr !max! (
  14.                     set/a max=!#%%b!
  15.                     set "#=%%b"
  16.             ) else if !#%%b! equ !max! set "#=!#! %%b"
  17.         )
  18.     )
  19.     (for %%c in (!#!) do (
  20.         echo %%c
  21.     ))>"e:\ZD\!p:~1!\!m:~1!\%%i"
  22.     endlocal
  23. )))
复制代码

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-4-14 08:58:14 | 显示全部楼层
回复 1# 思想之翼


你希望的优化具体是指什么呢,减少代码行数吗?
还是缩短执行时间呢?现在这个代码耗时多少秒?需要缩短到多少秒?
又或者代码是别人写的你看不懂,希望改成你能看懂的样子?

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

 楼主| 发表于 2023-4-14 11:05:22 | 显示全部楼层
回复 2# Batcher
提问空洞,以后改进。
我在原代码基础上,加了循环语句,故而出现2处变量延迟。
代码非循环运行,耗时大约80毫秒,对于只有1列10行左右数据的文本,似乎耗时过多。
该代码多线程并行运行时,似乎并不能发挥多物理核心的优势,CPU始终只占9%
故而产生了能否优化的想法。
发表于 2023-4-14 11:15:16 | 显示全部楼层
回复 3# 思想之翼


我在原代码基础上,加了循环语句,故而出现2处变量延迟。

这里我看不太明白,你把第9行、第22行删掉之后,代码有啥问题吗?
 楼主| 发表于 2023-4-14 11:34:58 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-14 11:38 编辑

回复 4# Batcher

第9行、第22行 不能删除,否则结果错误。想要提速,估计只能改变算法了。
发表于 2023-4-14 12:07:55 | 显示全部楼层
本帖最后由 77七 于 2023-4-14 12:20 编辑

每个文本都是只有1列吗?
a
a
b
c
e


这样?
"e:\JZ\01\" 这个目录下是否有多余的文本?为什么要写两个for循环获取文件夹名称呢?如果没有多余文本,试试这样,使用前先测试一下,代码对不对
  1. @echo off
  2. cd /d "e:\JZ\01"
  3. for /r %%i in (*.txt) do (
  4.         setlocal enabledelayedexpansion
  5.         for /f "delims=" %%a in ('type "%%i"') do (
  6.                 set/a #%%a+=1
  7.                 if !#%%a! gtr !max! (
  8.                         set/a max=!#%%a!
  9.                         set "#=%%a"
  10.                 ) else if !#%%a! equ !max! set "#=!#! %%a"
  11.         )
  12.         for /f "delims=" %%d in ("%%i\..") do (
  13.                 (for %%c in (!#!) do (
  14.                         echo %%c
  15.                 ))>"e:\ZD\01\%%~nxd\%%~nxi"
  16.         )
  17.         endlocal
  18. )
  19. pause
复制代码

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢

查看全部评分

发表于 2023-4-14 12:21:27 | 显示全部楼层
回复 5# 思想之翼


    请把报错信息发出来看看
 楼主| 发表于 2023-4-14 12:26:07 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-14 12:32 编辑

回复 6# 77七
在原代码基础上添加的,达不到通盘考虑的水准。
每个文本都是只有1列字符。
"e:\JZ\" 这个目录下,有若干子孙文件夹,没有多余文本。即  e:\JZ\01~21\000001~201376\
每个子文件夹内,有7个文本。

e:\JZ\01\000001\000001_1.txt ~ 000001_7.txt
e:\JZ\01\000002\000002_1.txt ~ 000002_7.txt
e:\JZ\01\000003\000003_1.txt ~ 000003_7.txt
...
e:\JZ\02\000001\000001_1.txt ~ 000001_7.txt
e:\JZ\02\000002\000002_1.txt ~ 000002_7.txt
e:\JZ\02\000003\000003_1.txt ~ 000003_7.txt
...
发表于 2023-4-14 12:31:47 | 显示全部楼层
本帖最后由 77七 于 2023-4-14 12:32 编辑

回复 8# 思想之翼


  
  1. for /l %%f in (101,1,101) do (
复制代码
还有02 文件夹吗?需要处理吗?在你添加的代码部分没有显示
只有一列,我把提取部分去掉了一个for,原代码是可以处理多列的,效率应该会高一点点吧

评分

参与人数 1技术 +1 收起 理由
思想之翼 + 1 感谢!

查看全部评分

 楼主| 发表于 2023-4-14 12:48:51 | 显示全部楼层
本帖最后由 思想之翼 于 2023-4-14 13:08 编辑

回复 9# 77七
子、孙文件夹 e:\JZ\01~21\000001~201376\
为了实现多线程并行运行,需要用代码灵活拆分 子文件夹(01~21)、孙文件夹(000001~201376),故添加了2个for,在源代码的基础上又用了一个变量延迟
您将原代码处理多列改为一列,学习了。批处理方面我是零基础,是在一个个实例中边用边学的。感谢帮助!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 22:27 , Processed in 0.022141 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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