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

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

本帖最后由 思想之翼 于 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. )))
复制代码
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 1# 思想之翼


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

评分人数

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

TOP

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

TOP

回复 3# 思想之翼


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

这里我看不太明白,你把第9行、第22行删掉之后,代码有啥问题吗?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 思想之翼 于 2023-4-14 11:38 编辑

回复 4# Batcher

第9行、第22行 不能删除,否则结果错误。想要提速,估计只能改变算法了。

TOP

本帖最后由 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

评分人数

bat小白,请多指教!谢谢!

TOP

回复 5# 思想之翼


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

TOP

本帖最后由 思想之翼 于 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
...

TOP

本帖最后由 77七 于 2023-4-14 12:32 编辑

回复 8# 思想之翼


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

评分人数

bat小白,请多指教!谢谢!

TOP

本帖最后由 思想之翼 于 2023-4-14 13:08 编辑

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

TOP

返回列表