标题: [文本处理] 求助坛友bat 对比2文本内容,给出相同与不同 [打印本页]
作者: 881966 时间: 2023-2-19 19:37 标题: 求助坛友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
作者: WHY 时间: 2023-2-20 13:24
type "a" | findstr /bevlig:"b.txt">不同内容.txt 这一句是错误的。
看了下附件,两个文本大小都不超过3MB,13W多行,谈不上"超大"。
用 PowerShell 就可以搞定,脚本长一点而已。
保存为 Test.ps1,单击右键,选择"使用 PowerShell 运行"。- $myPath = $MyInvocation.MyCommand.Path -replace '\\[^\\]*$', '\';
- $fileA = $myPath + 'a.txt'; #源文本A
- $fileB = $myPath + 'b.txt'; #源文本B
- $fSame = $myPath + '相同.txt'; #相同文本
- $fDiff = $myPath + '不同.txt'; #不同文本
-
- If (![IO.File]::Exists($fileA) -or ![IO.File]::Exists($fileB)){
- echo '源文件不存在';
- [Console]::ReadLine();
- exit;
- }
-
- $htA = New-Object System.Collections.HashTable; #HashTable,存放文本A数据
- $htB = New-Object System.Collections.HashTable; #HashTable,存放文本B数据
- $srA = New-Object System.IO.StreamReader($fileA, [Text.Encoding]::Default); #读文本A
- $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default); #读文本B
- $swSame = New-Object System.IO.StreamWriter($fSame, $false, [Text.Encoding]::Default); #写文件->相同
- $swDiff = New-Object System.IO.StreamWriter($fDiff, $false, [Text.Encoding]::Default); #写文件->不同
-
- while($srB.Peek() -ge 0){
- $strLine = $srB.ReadLine(); #逐行读文本B
- If (!$htB.ContainsKey($strLine)){
- $htB.Add($strLine, $true); #存入HashTable
- }
- }
- $srB.Dispose();
- $srB.Close();
-
- while($srA.Peek() -ge 0){
- $strLine = $srA.ReadLine(); #逐行读文本A
- If (!$htA.ContainsKey($strLine)){
- $htA.Add($strLine, $true); #存入HashTable
- }
- If (!$htB.ContainsKey($strLine)){
- $swDiff.WriteLine($strLine); #写文件->不同
- $swDiff.Flush();
- } Else {
- $swSame.WriteLine($strLine); #写文件->相同
- $swSame.Flush();
- }
- }
- $srA.Dispose();
- $srA.Close();
- $swSame.Dispose();
-
- $srB = New-Object System.IO.StreamReader($fileB, [Text.Encoding]::Default); #读文本B
- while($srB.Peek() -ge 0){
- $strLine = $srB.ReadLine();
- If (!$htA.ContainsKey($strLine)){
- $swDiff.WriteLine($strLine); #写文件->不同
- $swDiff.Flush();
- }
- }
- $srB.Dispose();
- $srB.Close();
- $swDiff.Dispose();
-
- echo 'Done';
- [Console]::ReadLine();
复制代码
作者: 881966 时间: 2023-2-20 17:20
回复 2# WHY
感谢帮助 ,我的电脑不能运行PowerShell ,附件的两个文本大小只是象征性的,
作者: Batcher 时间: 2023-2-20 21:46
回复 1# 881966
第三方命令行工具 grep 处理大文件的效率还不错
http://bcn.bathome.net/s/tool/index.html?key=grep- grep -xFf 1.txt 2.txt > Same.txt
- grep -vxFf 1.txt 2.txt > Diff.txt
复制代码
作者: hfxiang 时间: 2023-2-21 11:40
本帖最后由 hfxiang 于 2023-2-21 11:44 编辑
回复 4# Batcher
这个方法很简单,但有不明白之处,求解。具体如下:
测试文件1.txt及2.txt均已保存为ANSI编码,
1.txt- 203.208.39.194
- 203.208.40.66
- 220.181.174.226 translate.googleapis.com
- #
复制代码
2.txt(含空行,在第3行)- 203.208.39.194
- 203.208.40.66
-
- translate.google.cn
- #
复制代码
测试如下:- grep -xFf 1.txt 2.txt > Same1.txt
- grep -xFf 2.txt 2.txt > Same2.txt
- grep -vxFf 1.txt 2.txt > Diff1.txt
- grep -vxFf 2.txt 2.txt > Diff2.txt
复制代码
结果如下:
Same1.txt(正确)- 203.208.39.194
- 203.208.40.66
- #
复制代码
Same2.txt(错误)- 203.208.39.194
- 203.208.40.66
-
- translate.google.cn
- #
复制代码
Diff1.txt(错误)复制代码
俺的理解Diff1.txt应为- 220.181.174.226 translate.googleapis.com
-
- translate.google.cn
复制代码
Diff2.txt(为空)(错误)
俺的理解应为-
- translate.google.cn
- 220.181.174.226 translate.googleapis.com
复制代码
作者: hfxiang 时间: 2023-2-21 12:06
回复 1# 881966
如接受第3方工具gawk( http://bcn.bathome.net/tool/4.1.3/gawk.exe ),如下指令经测试正常(结果文档中已去除重复行,但其次序可能不一定是原文件次序)- awk "NR==FNR{a[$0]++;next}a[$0]{a[$0]=0;print}" 1.txt 2.txt>Same.txt
- 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
复制代码
作者: 881966 时间: 2023-2-21 14:15
回复 6# hfxiang
尽量不使用第三方
作者: Batcher 时间: 2023-2-21 14:24
回复 5# hfxiang
不知道楼主的需求和你的理解是否一致。
不过从这个测试结果来看,grep或findstr正常得到的结果就是这样的(不同于Linux的diff命令那样的比较结果)。
作者: 881966 时间: 2023-2-21 18:37
回复 6# hfxiang
尽量不用第三方处理
作者: wanghan519 时间: 2023-9-20 15:35
本帖最后由 wanghan519 于 2023-9-20 15:59 编辑
回复 5# hfxiang
我这里grep的结果没错,两个求相同的命令结果一样,求不同的两句分别是1里找不到2和2里找不到1,拼起来就是你要的结果
5楼的测试出错,因为第2第4句测试本身写错了。。。
作者: Nsqs 时间: 2023-10-7 06:35
不理解为什么要写那么复杂啊? 还是说我审题不清?- $C=(compare (gc A.txt) (gc B.txt) -IncludeEqual).Where({$_.SideIndicator -eq '=='},'split')
- $arr='相同','不同'
- 0..1|%{$C[$_].InputObject >"$($arr[$_]).txt"}
复制代码
作者: Batcher 时间: 2023-10-7 08:45
回复 3# 881966
真实需要处理的文件大小是怎样的?
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |