找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 27666|回复: 4

[文本处理] 求助批处理两个文本比较相同字符串并输出到新的文本文件

[复制链接]
发表于 2019-8-15 17:28:04 | 显示全部楼层 |阅读模式
我有两个utf-8编码的文本文件a.txt和b.txt,是收集的英文单词和短语,每行一个,想要实现查找这两个文本文件中相同的单词和词组(不区分单词大小写),并输出到新建的文本C.txt中。
在网上搜到这么一段批处理代码:
  1. @echo off&cd/d "%~dp0"
  2. echo 请等候...

  3. for /f "usebackq delims=" %%i in ("a.txt")do (
  4.   for %%j in (%%i)do set %%j=yes)
  5. for /f "usebackq delims=" %%i in ("b.txt")do (
  6.   for %%j in (%%i)do if defined %%j echo %%j>>"c.txt")
  7. set/p=处理完成,正在退出... >nul
  8. ping /n 3 127.1>nul
复制代码
但在处理文本时出现了好几个问题,比如:
a.txt内容:
aerobic
aerobic activity
aerobic-arrest
aerobic bacteria
affinity
affinity absorbent
affinity adsorption
affinity attraction
affinity banding agent

b.txt内容:
aerobic
aerobic activity
aerobic-arrest
aerobic bacteria
affinity
affinity absorbent
affinity-adsorption
affinity attraction
affinity binding
affinity banding agent
affinity choline transport
affinity-coefficient
affinity coelectrophoresis
affinity column
affinity constant

得到的c.txt却是:
aerobic
aerobic
activity
aerobic-arrest
aerobic
bacteria
affinity
affinity
absorbent
affinity
attraction
affinity
affinity
banding
agent
affinity
affinity
affinity
affinity


出现的问题:
1. a文本中以空格隔开的词组,与b文本对比后,词组被拆开成单个单词存在c文本中,如affinity banding agent被拆分成三个单词;
2. a文本中单个单词如果在b文本中遇到该单词开头的带有空格的词组时,会提取词组中开头的这个单词并存在c文本中,如a中affinity去查询b文本中的词组affinity coelectrophoresis,affinity column,affinity constant等时,会将词组中的affinity全部提取出来;
3. a文本中单个单词如果在b文本中遇到该单词开头的带有-连字符词组时,命令行窗口呈现假死状态,程序停顿进行不下去。

恳请各位大神给个可靠的批处理代码解决上述的问题,多谢了!
 楼主| 发表于 2019-8-15 17:35:38 | 显示全部楼层
对了,还得要导出的c.txt为utf-8编码,否则字符会乱码
发表于 2019-8-15 22:34:49 | 显示全部楼层
  1. @echo off
  2. set info=互助互利,支付宝扫码头像,感谢赞助
  3. rem 有问题,可加QQ956535081及时沟通
  4. title %info%
  5. cd /d "%~dp0"
  6. set "f1=a.txt"
  7. set "f2=b.txt"
  8. set "f3=c.txt"
  9. powershell -NoProfile -ExecutionPolicy bypass ^
  10.     $dic=New-Object 'System.Collections.Generic.Dictionary[string,string]';^
  11.     [System.Collections.ArrayList]$s=@();^
  12.     $text1=[IO.File]::ReadAllLines('%f1%',[Text.Encoding]::UTF8);^
  13.     $text2=[IO.File]::ReadAllLines('%f2%',[Text.Encoding]::UTF8);^
  14.     for($i=0;$i -lt $text1.count;$i++){^
  15.         if(-not $dic.ContainsKey($text1[$i].toLower())){^$dic.Add($text1[$i],'');};^
  16.     };^
  17.     for($i=0;$i -lt $text2.count;$i++){^
  18.         if($dic.ContainsKey($text2[$i].toLower())){[void]$s.Add($text2[$i]);};^
  19.     };^
  20.     write-host $s.count;^
  21.     [IO.File]::WriteAllLines('%f3%', $s, [Text.Encoding]::UTF8);
  22. echo;%info%
  23. pause
复制代码
 楼主| 发表于 2019-8-16 09:05:14 | 显示全部楼层
经测试,完美!

非常感谢zaqmlp !
发表于 2019-8-16 10:57:52 | 显示全部楼层
回复 4# baibat

那就赞助下吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 06:58 , Processed in 0.017318 second(s), 7 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表