Board logo

标题: [文本处理] 替换超大文本内容的第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=#####")

::
  1. @echo off&md tmp
  2. set "var=#####"
  3. set "find1=(set/p=%var%<nul&findstr ".*" "%%a")"
  4. set "find2=(set/p=%var%<nul&findstr /vb "%var%")"
  5. for /f "delims=" %%a in ('dir/b/a-d *.txt') do (
  6.    call :loop "%%a" "tmp\%%~na_888%%~xa"
  7.   (%find1%|%find2%|findstr /vb "%var%")>>"tmp\%%~na_888%%~xa"
  8. )
  9. start tmp
  10. exit
  11. :loop
  12. set /p n1=<"%~1"
  13. >"%~2" echo.%n1%
  14. for /f "usebackq skip=1 delims=" %%a in ("%~1") do (
  15.    set "n2=%%a"
  16.    >>"%~2" call echo.%%n2:666=888%%
  17.    goto :EOF
  18. )
  19. 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