标题: [文本处理] 替换超大文本内容的第2行 [打印本页]
作者: 随风 时间: 2008-11-2 17:19 标题: 替换超大文本内容的第2行
替换超大文本内容的第2行
几天前看到有一帖提问:
http://www.bathome.net/thread-2360-1-1.html
要求把所有txt文件内容的第2行的666替换为888(文件很大)
又是一个挑战效率的问题。
回家想出代码后,今天发现此帖因违规而被版主关闭了,汗。。
因时间有限,现将代码帖在2楼并屏蔽,等 ggwwhh888 会员把原帖修改合格后再麻烦版主解除屏
蔽。
将当前文件夹内所有txt文本的第2行的666替换为888
测试环境及效果:
处理 20 个文本文件,每个文件 42万行,大小 12M
耗时:0 小时 1 分钟 3 秒 82 毫秒
测试环境:cup 1.0 内存:128M 系统 xp&cmd
此题也可作为一个挑战题目,看看各位能否有更高效的代码。
[ 本帖最后由 随风 于 2008-11-2 17:25 编辑 ]
作者: 随风 时间: 2008-11-2 17:20
将当前文件夹内所有txt文本的第2行的666替换为888
问题的关键在于如何忽略文本的头2行。
对超大文件来说 for 太慢。
more 也不快,且无法处理超过 65535 行的文本。(呵,不知是否我不会用?)
如果规定只能用cmd命令的话就只有 findstr 是最佳选择了。
测试环境及效果:
处理 20 个文本文件,每个文件 42万行,大小 12M
耗时:0 小时 1 分钟 3 秒 82 毫秒
测试环境:cup 1.0 内存:128M 系统:xp@cmd
要求:文本内容不能有 以5个 ##### 开头的行,(若有、可自行修改 set "var=#####")
::- @echo off&md tmp
- set "var=#####"
- set "find1=(set/p=%var%<nul&findstr ".*" "%%a")"
- set "find2=(set/p=%var%<nul&findstr /vb "%var%")"
- for /f "delims=" %%a in ('dir/b/a-d *.txt') do (
- call :loop "%%a" "tmp\%%~na_888%%~xa"
- (%find1%|%find2%|findstr /vb "%var%")>>"tmp\%%~na_888%%~xa"
- )
- start tmp
- exit
- :loop
- set /p n1=<"%~1"
- >"%~2" echo.%n1%
- for /f "usebackq skip=1 delims=" %%a in ("%~1") do (
- set "n2=%%a"
- >>"%~2" call echo.%%n2:666=888%%
- goto :EOF
- )
- goto :EOF
复制代码
作者: Batcher 时间: 2008-11-3 00:47
如果只是为了解决问题而解决问题的话,我会选择用sed或者change之类的第三方命令行工具。
BAT如果要考虑特殊字符的话,可能会比较麻烦吧,不过确实是一个锻炼的好机会。
作者: terse 时间: 2008-11-3 12:03
处理单个17725KB的文件 用时12秒多 也就是最快一分钟处理5个文件
晚上在来看随风兄的精彩代码
作者: terse 时间: 2008-11-5 00:46
一个 挑战效率的问题 顶上去 怎么样
顺便问一下随风兄 要考虑 文件内相同行吗
作者: Batcher 时间: 2008-11-5 11:13
可能 ggwwhh888 已经不再关注这个问题了吧。
毕竟,喜欢代码的人多,喜欢批处理的人少。
作者: 随风 时间: 2008-11-5 22:18 标题: 回复 5楼 的帖子
我的代码条件是不能有5个#开头的行,(可自定义)
头2行不能有特殊字符。
作者: terse 时间: 2008-11-6 01:27
我的代码条件是第一行和第二行不能和后面行有相同
头2行不能有特殊字符
速度20个12Mb的文件 12秒左右
显然不通用了
欢迎光临 批处理之家 (http://bathome.net./) |
Powered by Discuz! 7.2 |