Board logo

标题: [文本处理] 批处理将一组文本中多行内容写入新的文本中 [打印本页]

作者: saymissme    时间: 2008-3-28 23:36     标题: 批处理将一组文本中多行内容写入新的文本中

假设遇到这样一个情况,这里有上千个文本
在每个文本里面都有这样的一个特殊字词:bathome,而且在这个文本里面这样的这样的字词只存在一处
如:

sadsalklkewr
sdfsdkiwek;la
df3w344
sdf4332

bathome
saymissme
thank you

oiio34230ds
3240230

需要将bathome这一行和下面的2行或者更多行一起存入一个新的文本里,如:
bathome
saymissme
thank you

这上千个文本都是放在同一文件夹内,命名没有关联性,如何用bat语言实现呢?
谢谢大家

[ 本帖最后由 saymissme 于 2008-3-28 23:38 编辑 ]
作者: youxi01    时间: 2008-3-29 12:40

程序的效率跟 好多情况有关的
所以尽量把你的问题说细致!
或者 公布几个源文件,给大家参考!!

有些信息至关重要,比如:bathome这个词,在每个文件里,行位置相同吗?等等
作者: 梦想种子    时间: 2008-3-29 12:48

用批处理有个问题不懂解决,就是用delims=时,即分隔符为回车符,会将“bathome”那一段落后的空行去掉,于是无法判断是否已经段落结束了。

用VBS倒容易解决。
  1. set fso= createobject("scripting.filesystemobject")
  2. set folder= fso.getfolder(".")
  3. set files=folder.files
  4. set res=fso.opentextfile("result.txt",8,1)
  5. for each file in files
  6. if lcase(fso.getextensionname(file)) = "txt" then
  7. res.write getstr(file)
  8. res.writeline
  9. end if
  10. next
  11. function getstr(a)
  12. flag=false
  13. set t=fso.opentextfile(a)
  14. do until t.atendofstream
  15. s=t.readline
  16. if s="bathome" then
  17. flag=true
  18. end if
  19. if flag=true then
  20. if len(s)<>0 then
  21. getstr=getstr & s & vbcrlf
  22. else
  23. exit do
  24. end if
  25. end if
  26. loop
  27. end function
复制代码

作者: 随风    时间: 2008-3-29 13:01

还有个问题。
bathome 在文档中都是单独占一行,还是在某行中含有bathome
如eutjbathomesd

是都在固定的行?还是不确定的行?

[ 本帖最后由 随风 于 2008-3-29 13:02 编辑 ]
作者: 梦想种子    时间: 2008-3-29 18:46

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "delims=" %%i in ('dir /b *.txt') do (
  3. call :get "%%i"
  4. echo.
  5. )
  6. pause
  7. exit
  8. :get
  9. set flag=false
  10. for /f "tokens=1,2 delims=:" %%j in ('findstr /n .* %1') do (
  11. if "%%k" == "bathome" set flag=true
  12. if "!flag!" == "true" (
  13. if not "%%k" == "" (echo %%k) else goto :eof
  14. )
  15. )
复制代码

作者: 随风    时间: 2008-3-29 19:16

max 为需要的行数。
:
  1. @echo off&setlocal enabledelayedexpansion
  2. set max=2
  3. for /f "delims=" %%i in ('dir /b *.txt') do (
  4.   set "flag="
  5.   for /f "delims=" %%a in ('type "%%i"') do (
  6.      if /i "%%a"=="bathome" set /a flag+=1
  7. if defined flag if !flag! leq !max! >>tmp.txt echo %%a
  8. ))
  9. start tmp.txt
复制代码





欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2