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

[文本处理] 求助坛友bat 对比2文本内容,给出相同与不同

求助坛友     bat 对比包含特殊字符与超大的2文本内容,给出相同与不同

网上的基本上都参考了,始终无果,特此求助坛友,尽量不用第三方

type "a.txt" | findstr /belig:"b.txt">>相同内容.txt
type "a" | findstr /bevlig:"b.txt">不同内容.txt
type "a.txt" | findstr /bevlig:"b.txt">>不同内容.txt

以上代码可以处理无特殊字符的小文件

链接:https://pan.baidu.com/s/1sW7vsjDGth92b9r-dfAVOQ
提取码:1234

恳请坛友斧正:handshake

type "a" | findstr /bevlig:"b.txt">不同内容.txt 这一句是错误的。
看了下附件,两个文本大小都不超过3MB,13W多行,谈不上"超大"。
用 PowerShell 就可以搞定,脚本长一点而已。

保存为 Test.ps1,单击右键,选择"使用 PowerShell 运行"。
  1. $myPath = $MyInvocation.MyCommand.Path -replace '\\[^\\]*$', '\';
  2. $fileA = $myPath + 'a.txt';            #源文本A
  3. $fileB = $myPath + 'b.txt';            #源文本B
  4. $fSame = $myPath + '相同.txt';         #相同文本
  5. $fDiff = $myPath + '不同.txt';         #不同文本
  6. If (![IO.File]::Exists($fileA) -or ![IO.File]::Exists($fileB)){
  7.     echo '源文件不存在';
  8.     [Console]::ReadLine();
  9.     exit;
  10. }
  11. $htA = New-Object System.Collections.HashTable;                               #HashTable,存放文本A数据
  12. $htB = New-Object System.Collections.HashTable;                               #HashTable,存放文本B数据
  13. $srA = New-Object System.IO.StreamReader($fileA, [Text.Encoding]::Default);   #读文本A
  14. $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default);   #读文本B
  15. $swSame = New-Object System.IO.StreamWriter($fSame, $false, [Text.Encoding]::Default); #写文件->相同
  16. $swDiff = New-Object System.IO.StreamWriter($fDiff, $false, [Text.Encoding]::Default); #写文件->不同
  17. while($srB.Peek() -ge 0){
  18.     $strLine = $srB.ReadLine();           #逐行读文本B
  19.     If (!$htB.ContainsKey($strLine)){
  20.         $htB.Add($strLine, $true);        #存入HashTable
  21.     }
  22. }
  23. $srB.Dispose();
  24. $srB.Close();
  25. while($srA.Peek() -ge 0){
  26.     $strLine = $srA.ReadLine();           #逐行读文本A
  27.     If (!$htA.ContainsKey($strLine)){
  28.         $htA.Add($strLine, $true);        #存入HashTable
  29.     }
  30.     If (!$htB.ContainsKey($strLine)){
  31.         $swDiff.WriteLine($strLine);      #写文件->不同
  32.         $swDiff.Flush();
  33.     } Else {
  34.         $swSame.WriteLine($strLine);      #写文件->相同
  35.         $swSame.Flush();
  36.     }
  37. }
  38. $srA.Dispose();
  39. $srA.Close();
  40. $swSame.Dispose();
  41. $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default);   #读文本B
  42. while($srB.Peek() -ge 0){
  43.     $strLine = $srB.ReadLine();
  44.     If (!$htA.ContainsKey($strLine)){
  45.         $swDiff.WriteLine($strLine);      #写文件->不同
  46.         $swDiff.Flush();
  47.     }
  48. }
  49. $srB.Dispose();
  50. $srB.Close();
  51. $swDiff.Dispose();
  52. echo 'Done';
  53. [Console]::ReadLine();
复制代码
1

评分人数

TOP

回复 2# WHY

感谢帮助 ,我的电脑不能运行PowerShell ,附件的两个文本大小只是象征性的,

TOP

回复 1# 881966


第三方命令行工具 grep 处理大文件的效率还不错
http://bcn.bathome.net/s/tool/index.html?key=grep
  1. grep -xFf 1.txt 2.txt > Same.txt
  2. grep -vxFf 1.txt 2.txt > Diff.txt
复制代码
1

评分人数

我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 hfxiang 于 2023-2-21 11:44 编辑

回复 4# Batcher

这个方法很简单,但有不明白之处,求解。具体如下:
测试文件1.txt及2.txt均已保存为ANSI编码,
1.txt
  1. 203.208.39.194
  2. 203.208.40.66
  3. 220.181.174.226 translate.googleapis.com
  4. #
复制代码
2.txt(含空行,在第3行)
  1. 203.208.39.194
  2. 203.208.40.66
  3. translate.google.cn
  4. #
复制代码
测试如下:
  1. grep -xFf 1.txt 2.txt > Same1.txt
  2. grep -xFf 2.txt 2.txt > Same2.txt
  3. grep -vxFf 1.txt 2.txt > Diff1.txt
  4. grep -vxFf 2.txt 2.txt >  Diff2.txt
复制代码
结果如下:
Same1.txt(正确
  1. 203.208.39.194
  2. 203.208.40.66
  3. #
复制代码
Same2.txt(错误
  1. 203.208.39.194
  2. 203.208.40.66
  3. translate.google.cn
  4. #
复制代码
Diff1.txt(错误
  1. translate.google.cn
复制代码
俺的理解Diff1.txt应为
  1. 220.181.174.226 translate.googleapis.com
  2. translate.google.cn
复制代码
Diff2.txt(为空)(错误
俺的理解应为
  1. translate.google.cn
  2. 220.181.174.226 translate.googleapis.com
复制代码

TOP

回复 1# 881966

如接受第3方工具gawk( http://bcn.bathome.net/tool/4.1.3/gawk.exe ),如下指令经测试正常(结果文档中已去除重复行,但其次序可能不一定是原文件次序)
  1. awk "NR==FNR{a[$0]++;next}a[$0]{a[$0]=0;print}" 1.txt 2.txt>Same.txt
  2. awk "NR==FNR{a[$0]=1;next}!a[$0]++{print $0;a[$0]++}END{for(i in a)if(a[i]==1)print i}" 1.txt 2.txt>Diff.txt
复制代码
1

评分人数

TOP

回复 6# hfxiang


    尽量不使用第三方

TOP

回复 5# hfxiang


不知道楼主的需求和你的理解是否一致。
不过从这个测试结果来看,grep或findstr正常得到的结果就是这样的(不同于Linux的diff命令那样的比较结果)。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 6# hfxiang


    尽量不用第三方处理

TOP

本帖最后由 wanghan519 于 2023-9-20 15:59 编辑

回复 5# hfxiang


    我这里grep的结果没错,两个求相同的命令结果一样,求不同的两句分别是1里找不到2和2里找不到1,拼起来就是你要的结果
5楼的测试出错,因为第2第4句测试本身写错了。。。

TOP

不理解为什么要写那么复杂啊? 还是说我审题不清?
  1. $C=(compare (gc A.txt) (gc B.txt) -IncludeEqual).Where({$_.SideIndicator -eq '=='},'split')
  2. $arr='相同','不同'
  3. 0..1|%{$C[$_].InputObject >"$($arr[$_]).txt"}
复制代码

TOP

回复 3# 881966


    真实需要处理的文件大小是怎样的?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

返回列表