[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 批处理搜索txt里的内容后符合的行复制到新建的txt里面

各位bat论坛的大佬们:我有一个小需求,求教一个bat,我的需求是根据“清单.txt”里面的内容,从”目标.txt”里面进行搜索,搜索到内容后移动这一行数据到新的txt里,具体做法如下:
1、”清单.txt”里有很多行数据,先取第一行数据“aaa-bbb-ccc”,去”目标.txt”去搜索
2、”目标.txt”里也有很多行数据,发现整个txt中只有第1行和第11行数据匹配(完全匹配和包含匹配都算作匹配),那就新建一个txt,取名为“aaa-bbb-ccc.txt”,把符合的这几行数据复制(或者剪切)到新建的“aaa-bbb-ccc.txt”内。
3、然后继续取”清单.txt”里第二行的内容“a123-111”,去”目标.txt”遍历匹配,匹配到的行同样转移到新建的“a123-111.txt”里面。
4、以此类题
5、示例上传到了百度云链接:https://pan.baidu.com/s/1xdk2qf7tsmDX2pSwrFrXLg 提取码:d7lm

本帖最后由 77七 于 2023-6-17 13:53 编辑

回复 15# qixiaobin0715


   谢谢大佬指导!我记住了,findstr /g:1.txt 2.txt,从1.txt获得(get)需要匹配的字符串,学习了!如果不加/l,则可以直接编辑1.txt,使用元字符限制开头和结尾,对要从2.txt中进行复杂的匹配很有用处!
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2023-6-17 09:57 编辑

回复 12# 77七
如果没有其它需求,可使用参数“/g:”试试。
不过使用/g时,要注意:
http://bbs.bathome.net/thread-14 ... E%E5%BC%8F%E3%80%82

TOP

本帖最后由 hfxiang 于 2023-6-16 19:53 编辑

回复 1# 304802301

当数据量较大时建议使用第3方工具,如gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),实现指令如下:
  1. gawk "{NR==FNR?a[++M]=$0:b[++N]=$0}END{for(i=1;i<=M;i++){for(j=1;j<=N;j++){if(b[j]~a[i]){print(b[j])>(a[i]\".txt\")}}close(a[i]\".txt\")}}" 清单.txt 目标.txt
复制代码
注意,请确保“清单.txt”及“目标.txt”已保存为ANSI编码格式

TOP

回复 9# 304802301


   已在2楼修改,如果清单的行含有空格,就使用修改后的代码。
bat小白,请多指教!谢谢!

TOP

回复 8# qixiaobin0715

我测试的时候连续写了几个含有 " 的行,没仔细看是哪个行引起的,不好意思!
  1. @echo off
  2. >1.txt echo "1
  3. >2.txt echo "123
  4. for /f "delims=" %%a in (1.txt) do (
  5. findstr /c:"%%a" 2.txt
  6. )
  7. pause
复制代码

这样就卡住了
bat小白,请多指教!谢谢!

TOP

保存为vbs
  1. function gettext(fp)
  2.     Set objStream = CreateObject("ADODB.Stream")
  3.     objStream.CharSet = "utf-8"
  4.     objStream.Open
  5.     objStream.LoadFromFile fp
  6.    gettext=objstream.readtext
  7. end function
  8. sub writetext(fp,t)
  9.     Set objStream = CreateObject("ADODB.Stream")
  10.     objStream.CharSet = "utf-8"
  11.     objStream.Open
  12. objstream.writetext t
  13.     objStream.savetoFile fp,2
  14. end sub
  15. set re=new regexp
  16. re.global=true
  17. t=gettext("目标.txt")
  18. for each l in split(gettext("清单.txt"),vbcrlf)
  19. if l<>"" then
  20.   re.pattern=".*"&l&".*"
  21. tt=""
  22.   if re.test(t) then
  23.     writetext l&".txt",join(c2a(re.execute(t)),"")
  24.   end if
  25. end if
  26. next
  27. function c2a(c)
  28. execute("dim arr("&c.count-1&")")
  29. for i=0 to c.count-1
  30. arr(i)=c(i)
  31. next
  32. c2a=arr
  33. end function
复制代码
你好

TOP

回复 3# qixiaobin0715


   
    大佬,因为真实数据比较敏感,我稍微处理了下,尽可能保留了各种空格、字符等。V2版本链接:https://pan.baidu.com/s/11KzxBY8XIQrXcpWtUHlLpA 提取码:g5yo
另外用2楼的代码可以实现,且效率较高。4楼的代码效率比较低,而且不太对,有些匹配不到。

TOP

回复 2# 77七


    大佬,因为真实数据比较敏感,我稍微处理了下,尽可能保留了各种空格、字符等。V2版本链接:https://pan.baidu.com/s/11KzxBY8XIQrXcpWtUHlLpA 提取码:g5yo
另外用2楼的代码可以实现,且效率较高。4楼的代码效率比较低,而且不太对,有些匹配不到。

TOP

本帖最后由 qixiaobin0715 于 2023-6-16 16:39 编辑

回复 7# 77七
直接在cmd中运行我这里没问题啊
  1. findstr /c:""" 1.txt
复制代码
不带参数也没问题。
find要这样:
  1. find """" 1.txt
复制代码

TOP

回复 6# qixiaobin0715

谢谢大佬!我试了一下,不考虑文件名,特殊状态下存在的英文的双引号,使用find 或者findstr 都会出错。试着只查找一个英文双引号,就卡着不动了。
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2023-6-16 15:46 编辑

回复 4# 77七
亦或使用/c:就可以不再使用/l
如果使用了/c,有可能默认是/l /c:组合。
可以从这里加以印证。
http://bbs.bathome.net/thread-14682-1-1.html#pid99416
自己未经验证。

TOP

回复 4# 77七
没做过测试,只是提出一种可能性。
有一点可以确定,清单中不能出现文件名中不能出现的字符(如/?\等);
至于其它情况(比如含有^$等字符)是否可以使用组合参数/l /c:,未验证是否可行。

TOP

回复 3# qixiaobin0715


   谢谢大佬指导!我自己试了一下,确实错误,可能需要用到 /c 开关?findstr 还是太复杂,感觉有特殊字符,会不会还会出错?
我直接换成find的吧
  1. @echo off
  2. for /f "delims=" %%a in ('type "清单.txt"') do (
  3. >"%%a.txt" (type "目标.txt" | find "%%a")
  4. )
  5. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2023-6-16 14:43 编辑

发现很多求助者在举例的时候都喜欢胡乱杜撰一些内容,殊不知这样可能会和实际情况相差很多。
比如上例中如果“清单.txt”含有空格或特殊字符,使用楼上的代码就可能会出现问题。
我把你提供的文本做些改动,使用楼上代码看看:
清单.txt
  1. q aaa-bbb-ccc
  2. a123-111
复制代码

TOP

返回列表