Board logo

标题: [文本处理] 批处理如何在文本首个/第一个出现的含有指定字符串/关键字的行的末尾添加指定内容 [打印本页]

作者: lyhli13    时间: 2016-12-20 20:49     标题: 批处理如何在文本首个/第一个出现的含有指定字符串/关键字的行的末尾添加指定内容

本帖最后由 pcl_test 于 2016-12-24 07:56 编辑

求助!编辑文本文件。
本人那小白,请求大神帮帮忙!
有一个20万行左右的文本文件,要求找到关键字的那行之后,在行末尾加入一段字符,再之后保存文件就可以了。(只做一次,后面如果有关键字的行就不用做处理)
文本文件大小4M左右,关键字位置大概在2之3万行左右,最好处理效率要高,不能太慢。。。
有哪位热心大哥能帮忙写段代码,万分感谢!!!!
作者: GNU    时间: 2016-12-21 11:50

修改之前:
a
b
关键字
c
关键字
d


修改之后:
a
b
关键字 bathome
c
关键字
d

是这个意思吗?
作者: lyhli13    时间: 2016-12-21 23:10

对对,就是在指定行尾加几个字符。
文件比较大,用批处理能写出比较高效的代码吗?
作者: Nsqs    时间: 2016-12-22 13:38

本帖最后由 Nsqs 于 2016-12-22 21:53 编辑
  1. :on error resume next
  2. :sub class_bat
  3. ' 2>nul&echo off&cls
  4. cscript -nologo -e:vbs "%~0"
  5. pause
  6. exit sub
  7. :end sub
  8. set fso=CreateObject("Scripting.FileSystemObject")
  9. set regexp=new regexp
  10. file="1.txt"
  11. RegExp.Global=0:RegExp.IgnoreCase=-1
  12. RegExp.Pattern="(.*关键字.*)" '关键字
  13. t=timer
  14. read=fso.opentextfile(file).readall
  15. s="abc" '替换后
  16. result=RegExp.Replace(read,"$1"&s)
  17. wsh.echo timer-t &" 秒"
  18. fso.createtextfile("new.txt").write result
  19. set fso=nothing:set regexp=nothing
复制代码
保存bat即可
作者: GNU    时间: 2016-12-22 14:40

把你的文件压缩一下传到百度网盘,方便测试。
作者: lyhli13    时间: 2016-12-22 20:49

100万行数据2秒处理完,保存vbs即可
Nsqs 发表于 2016-12-22 13:38


多谢大神!我那个专用应用程式貌似只能调用bat格式的批处理,麻烦能不能再用bat批处理代码写个?
作者: Nsqs    时间: 2016-12-22 21:54

回复 6# lyhli13


    更改
作者: WHY    时间: 2016-12-23 10:17

  1. $s = [IO.File]::ReadAllText('a.txt', [Text.Encoding]::Default);
  2. ([regex]('(?i)' + [regex]::Escape("Here's your [Keyword]") + '[^\r\n]*')).Replace($s, '$&ABC', 1) > b.txt
复制代码

作者: WHY    时间: 2016-12-23 10:18

  1. gawk "{if($0~/Here's your \[Keyword]/ && !a){a=1;$0=$0\"ABC\"}};1" a.txt > b.txt
复制代码

作者: pcl_test    时间: 2016-12-23 12:48

  1. @echo off
  2. set "file=文本.txt"
  3. for /f "delims=:" %%a in ('findstr /nl /c:"关键词" "%file%"') do set n=%%a&goto :end
  4. :end
  5. if defined n (
  6.     (for /f "tokens=1* delims=:" %%a in ('findstr /n .* "%file%"') do (
  7.         if "%%a" equ "%n%" (echo;%%b添加的内容) else echo;%%b
  8.     ))>"$tmp.txt"
  9.     rem move "$tmp.txt" "%file%"
  10. ) else echo;Not Found
  11. pause
复制代码

作者: pcl_test    时间: 2016-12-23 20:17

  1. /*&cls
  2. @echo off
  3. set "file=文本.txt"
  4. set "keywords=关键字"
  5. set "addstr=添加的内容"
  6. set "tmpfile=$tmp.txt"
  7. cscript -nologo -e:jscript "%~f0" "%file%" "%tmpfile%" "%keywords:\=\\%" "%addstr%"
  8. rem move "%tmpfile%" "%file%"
  9. pause&exit
  10. */
  11. var fso=new ActiveXObject('Scripting.FileSystemObject');
  12. var text=fso.OpenTextFile(WSH.Arguments(0), 1).ReadAll();
  13. var keywords=WSH.Arguments(2).replace(/[*.?+$^[\](){}|/]/g, '\\$&')
  14. var reg=new RegExp(keywords+'[^\\r\\n]*')
  15. var text=text.replace(reg, '$&'+WSH.Arguments(3));
  16. fso.CreateTextFile(WSH.Arguments(1), 2).Write(text);
复制代码

作者: lyhli13    时间: 2016-12-23 21:44

本帖最后由 lyhli13 于 2016-12-23 21:47 编辑

多谢各路大神!多谢管理哈哈
你们的智慧让我在工作中轻松了好多啊,减少了一个很烦人又必须要做的动作,真心感谢你们的帮助!!!谢谢谢谢了!!!
如果还有什么问题我会再回来请教各位的!




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