标题: [文本处理] 批处理搜索txt里的内容后符合的行复制到新建的txt里面 [打印本页]
作者: 304802301 时间: 2023-6-16 13:53 标题: 批处理搜索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-16 14:21
本帖最后由 77七 于 2023-6-16 17:23 编辑
- @echo off
- for /f "delims=" %%a in ('type "清单.txt"') do (
- >"%%a.txt" findstr "%%a" "目标.txt"
- )
- pause
复制代码
代码错误
修改为
- @echo off
- for /f "delims=" %%a in ('type "清单.txt"') do (
- >"%%a.txt" findstr /c:"%%a" "目标.txt"
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2023-6-16 14:23
本帖最后由 qixiaobin0715 于 2023-6-16 14:43 编辑
发现很多求助者在举例的时候都喜欢胡乱杜撰一些内容,殊不知这样可能会和实际情况相差很多。
比如上例中如果“清单.txt”含有空格或特殊字符,使用楼上的代码就可能会出现问题。
我把你提供的文本做些改动,使用楼上代码看看:
清单.txt复制代码
作者: 77七 时间: 2023-6-16 14:44
回复 3# qixiaobin0715
谢谢大佬指导!我自己试了一下,确实错误,可能需要用到 /c 开关?findstr 还是太复杂,感觉有特殊字符,会不会还会出错?
我直接换成find的吧
- @echo off
- for /f "delims=" %%a in ('type "清单.txt"') do (
- >"%%a.txt" (type "目标.txt" | find "%%a")
- )
- pause
复制代码
作者: qixiaobin0715 时间: 2023-6-16 14:59
回复 4# 77七
没做过测试,只是提出一种可能性。
有一点可以确定,清单中不能出现文件名中不能出现的字符(如/?\等);
至于其它情况(比如含有^$等字符)是否可以使用组合参数/l /c:,未验证是否可行。
作者: qixiaobin0715 时间: 2023-6-16 15:36
本帖最后由 qixiaobin0715 于 2023-6-16 15:46 编辑
回复 4# 77七
亦或使用/c:就可以不再使用/l
如果使用了/c,有可能默认是/l /c:组合。
可以从这里加以印证。
http://bbs.bathome.net/thread-14682-1-1.html#pid99416
自己未经验证。
作者: 77七 时间: 2023-6-16 16:18
回复 6# qixiaobin0715
谢谢大佬!我试了一下,不考虑文件名,特殊状态下存在的英文的双引号,使用find 或者findstr 都会出错。试着只查找一个英文双引号,就卡着不动了。
作者: qixiaobin0715 时间: 2023-6-16 16:33
本帖最后由 qixiaobin0715 于 2023-6-16 16:39 编辑
回复 7# 77七
直接在cmd中运行我这里没问题啊复制代码
不带参数也没问题。
find要这样:复制代码
作者: 304802301 时间: 2023-6-16 16:43
回复 2# 77七
大佬,因为真实数据比较敏感,我稍微处理了下,尽可能保留了各种空格、字符等。V2版本链接:https://pan.baidu.com/s/11KzxBY8XIQrXcpWtUHlLpA 提取码:g5yo
另外用2楼的代码可以实现,且效率较高。4楼的代码效率比较低,而且不太对,有些匹配不到。
作者: 304802301 时间: 2023-6-16 16:43
回复 3# qixiaobin0715
大佬,因为真实数据比较敏感,我稍微处理了下,尽可能保留了各种空格、字符等。V2版本链接:https://pan.baidu.com/s/11KzxBY8XIQrXcpWtUHlLpA 提取码:g5yo
另外用2楼的代码可以实现,且效率较高。4楼的代码效率比较低,而且不太对,有些匹配不到。
作者: jyswjjgdwtdtj 时间: 2023-6-16 17:19
保存为vbs- function gettext(fp)
- Set objStream = CreateObject("ADODB.Stream")
- objStream.CharSet = "utf-8"
- objStream.Open
- objStream.LoadFromFile fp
- gettext=objstream.readtext
- end function
- sub writetext(fp,t)
- Set objStream = CreateObject("ADODB.Stream")
- objStream.CharSet = "utf-8"
- objStream.Open
- objstream.writetext t
- objStream.savetoFile fp,2
- end sub
- set re=new regexp
- re.global=true
- t=gettext("目标.txt")
- for each l in split(gettext("清单.txt"),vbcrlf)
- if l<>"" then
- re.pattern=".*"&l&".*"
- tt=""
- if re.test(t) then
- writetext l&".txt",join(c2a(re.execute(t)),"")
- end if
- end if
- next
- function c2a(c)
- execute("dim arr("&c.count-1&")")
- for i=0 to c.count-1
- arr(i)=c(i)
- next
- c2a=arr
- end function
复制代码
作者: 77七 时间: 2023-6-16 17:21
回复 8# qixiaobin0715
我测试的时候连续写了几个含有 " 的行,没仔细看是哪个行引起的,不好意思!- @echo off
- >1.txt echo "1
- >2.txt echo "123
- for /f "delims=" %%a in (1.txt) do (
- findstr /c:"%%a" 2.txt
- )
- pause
复制代码
这样就卡住了
作者: 77七 时间: 2023-6-16 17:25
回复 9# 304802301
已在2楼修改,如果清单的行含有空格,就使用修改后的代码。
作者: hfxiang 时间: 2023-6-16 19:25
本帖最后由 hfxiang 于 2023-6-16 19:53 编辑
回复 1# 304802301
当数据量较大时建议使用第3方工具,如gawk( http://bcn.bathome.net/tool/4.1.0/gawk.exe ),实现指令如下:- 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编码格式
作者: qixiaobin0715 时间: 2023-6-17 08:40
本帖最后由 qixiaobin0715 于 2023-6-17 09:57 编辑
回复 12# 77七
如果没有其它需求,可使用参数“/g:”试试。
不过使用/g时,要注意:
http://bbs.bathome.net/thread-14 ... E%E5%BC%8F%E3%80%82
作者: 77七 时间: 2023-6-17 13:51
本帖最后由 77七 于 2023-6-17 13:53 编辑
回复 15# qixiaobin0715
谢谢大佬指导!我记住了,findstr /g:1.txt 2.txt,从1.txt获得(get)需要匹配的字符串,学习了!如果不加/l,则可以直接编辑1.txt,使用元字符限制开头和结尾,对要从2.txt中进行复杂的匹配很有用处!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |