标题: [文本处理] 【已解决】批处理变量延迟的表述是否可以优化? [打印本页]
作者: 思想之翼 时间: 2023-4-14 01:11 标题: 【已解决】批处理变量延迟的表述是否可以优化?
本帖最后由 思想之翼 于 2023-4-14 13:42 编辑
下述代码,用于提取出现最多次数的字符。
在原代码基础上,加了循环语句,故而出现2处变量延迟。
代码非循环运行,耗时大约80毫秒,对于只有1列10行左右数据的文本,似乎耗时过多。
该代码多线程并行运行时,似乎并不能发挥多物理核心的优势,CPU始终只占9%
故而产生能否优化的想法。- @echo off
- setlocal enabledelayedexpansion
- for /l %%f in (101,1,121) do (
- set p=%%f
- for /l %%g in (1000001,1,1100000) do (
- set m=%%g
- cd /d "e:\JZ\!p:~1!\!m:~1!"
- for %%i in (*.txt) do (
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in (%%i) do (
- for %%b in (%%a) do (
- set/a #%%b+=1
- if !#%%b! gtr !max! (
- set/a max=!#%%b!
- set "#=%%b"
- ) else if !#%%b! equ !max! set "#=!#! %%b"
- )
- )
- (for %%c in (!#!) do (
- echo %%c
- ))>"e:\ZD\!p:~1!\!m:~1!\%%i"
- endlocal
- )))
复制代码
作者: Batcher 时间: 2023-4-14 08:58
回复 1# 思想之翼
你希望的优化具体是指什么呢,减少代码行数吗?
还是缩短执行时间呢?现在这个代码耗时多少秒?需要缩短到多少秒?
又或者代码是别人写的你看不懂,希望改成你能看懂的样子?
作者: 思想之翼 时间: 2023-4-14 11:05
回复 2# Batcher
提问空洞,以后改进。
我在原代码基础上,加了循环语句,故而出现2处变量延迟。
代码非循环运行,耗时大约80毫秒,对于只有1列10行左右数据的文本,似乎耗时过多。
该代码多线程并行运行时,似乎并不能发挥多物理核心的优势,CPU始终只占9%
故而产生了能否优化的想法。
作者: Batcher 时间: 2023-4-14 11:15
回复 3# 思想之翼
我在原代码基础上,加了循环语句,故而出现2处变量延迟。
这里我看不太明白,你把第9行、第22行删掉之后,代码有啥问题吗?
作者: 思想之翼 时间: 2023-4-14 11:34
本帖最后由 思想之翼 于 2023-4-14 11:38 编辑
回复 4# Batcher
第9行、第22行 不能删除,否则结果错误。想要提速,估计只能改变算法了。
作者: 77七 时间: 2023-4-14 12:07
本帖最后由 77七 于 2023-4-14 12:20 编辑
每个文本都是只有1列吗?
这样?
"e:\JZ\01\" 这个目录下是否有多余的文本?为什么要写两个for循环获取文件夹名称呢?如果没有多余文本,试试这样,使用前先测试一下,代码对不对
- @echo off
- cd /d "e:\JZ\01\"
- for /r %%i in (*.txt) do (
- setlocal enabledelayedexpansion
- for /f "delims=" %%a in ('type "%%i"') do (
- set/a #%%a+=1
- if !#%%a! gtr !max! (
- set/a max=!#%%a!
- set "#=%%a"
- ) else if !#%%a! equ !max! set "#=!#! %%a"
- )
- for /f "delims=" %%d in ("%%i\..") do (
- (for %%c in (!#!) do (
- echo %%c
- ))>"e:\ZD\01\%%~nxd\%%~nxi"
- )
- endlocal
- )
- pause
复制代码
作者: Batcher 时间: 2023-4-14 12:21
回复 5# 思想之翼
请把报错信息发出来看看
作者: 思想之翼 时间: 2023-4-14 12:26
本帖最后由 思想之翼 于 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
...
作者: 77七 时间: 2023-4-14 12:31
本帖最后由 77七 于 2023-4-14 12:32 编辑
回复 8# 思想之翼
- for /l %%f in (101,1,101) do (
复制代码
还有02 文件夹吗?需要处理吗?在你添加的代码部分没有显示
只有一列,我把提取部分去掉了一个for,原代码是可以处理多列的,效率应该会高一点点吧
作者: 思想之翼 时间: 2023-4-14 12:48
本帖最后由 思想之翼 于 2023-4-14 13:08 编辑
回复 9# 77七
子、孙文件夹 e:\JZ\01~21\000001~201376\
为了实现多线程并行运行,需要用代码灵活拆分 子文件夹(01~21)、孙文件夹(000001~201376),故添加了2个for,在源代码的基础上又用了一个变量延迟
您将原代码处理多列改为一列,学习了。批处理方面我是零基础,是在一个个实例中边用边学的。感谢帮助!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |