标题: [文本处理] 批处理如何对比两个文本? [打印本页]
作者: pengyou86 时间: 2015-1-4 20:50 标题: 批处理如何对比两个文本?
测试1是原文,
测试1跟测试2里面的内容对比
对比后的结果导出保存到测试结果
测试2个内容排列顺序依据测试1为准
测试1和测试2对比后按照顺序保存到“测试结果”里面
比如测试2里面的第一行的内容 在测试1里面是第三行
经过批处理处理后 导出的结果是前2行是空行 第3行是内容
相关文本我已经上传到附件中 麻烦高手帮忙写个批处理 谢谢
我是win7 64位操作系统
作者: pengyou86 时间: 2015-1-4 21:54
麻烦高手帮忙写一下 谢谢
作者: yu2n 时间: 2015-1-4 22:15
囧,这么绕的事情为什么不用 Excel ?
作者: tmplinshi 时间: 2015-1-5 02:17
本帖最后由 tmplinshi 于 2015-1-5 02:41 编辑
- @echo off
- (for /f "tokens=1,2" %%a in (测试1.txt) do (
- findstr "^%%a$" 测试2.txt >nul && (
- echo %%a %%b
- ) || ( echo; )
- )) >测试结果.txt
复制代码
作者: terse 时间: 2015-1-5 02:20
- @echo off&setlocal enabledelayedexpansion
- for /f "delims=" %%i in (测试2.txt) do set $%%i=a
- for /f "tokens=1*" %%i in (测试1.txt) do (
- if defined $%%i (echo %%i %%j) else echo,
- )
- pause
复制代码
- @echo off&setlocal enabledelayedexpansion
- set n=1
- for /f "tokens=1*delims=:" %%a in ('findstr /ibng:测试2.txt 测试1.txt') do (
- for /l %%i in (!n!,1,%%a) do (
- if %%a equ %%i (echo %%b)else echo,
- set /a n=%%a+1
- )
- )
- pause
复制代码
作者: 慕夜蓝化 时间: 2015-1-5 08:53
回复 4# tmplinshi
昨天看到问题之后,直接就懵了。。。想着要用到findstr 就是不知道该怎么去写,最后连用了几个for 也没解决问题,就卡在那走不动,&&,和||也总是弄混>_<、
作者: pengyou86 时间: 2015-1-5 08:59
tmplinshi 发表于 2015-1-5 02:17
谢谢测试成功就是运行起来速度有点慢
作者: pengyou86 时间: 2015-1-5 09:01
terse 发表于 2015-1-5 02:20
谢谢你,麻烦你再修改一下 把对比后的结果保存到“测试结果.txt”中
本人小菜 请谅解
作者: pengyou86 时间: 2015-1-5 09:08
terse 发表于 2015-1-5 02:20
测试不能使用 谢谢
作者: pengyou86 时间: 2015-1-5 09:13
tmplinshi 发表于 2015-1-5 02:17
测试1文本内容很大有20多万行内容 批处理运行起来速度太慢。还有别的方法可以快速对比吗?
作者: DAIC 时间: 2015-1-5 09:45
回复 9# pengyou86
你需要举例说明什么叫做“不能使用”,否则人家没有办法继续帮助你。
作者: pengyou86 时间: 2015-1-5 09:53
回复 11# DAIC
都快一个小时了 批处理还没有对比完毕
作者: DAIC 时间: 2015-1-5 10:18
回复 12# pengyou86
所以嘛,你应该先找两个小文件验证一下功能是否正常。如果是效率不够高,人家可以优化。你留下一句“不能使用”人家怎么知道你遇到了啥问题。
作者: terse 时间: 2015-1-5 12:19
本帖最后由 terse 于 2015-1-5 14:14 编辑
测试不能使用 谢谢
pengyou86 发表于 2015-1-5 09:08
两个都不能使用吗
大文件个话 下面这段能否处理呢- @if(0)==(0) echo off
- cscript -nologo -e:javascript %0<测试1.txt >测试结果.txt "测试2.txt"
- pause&goto :eof
- @end
- Array.prototype.arr_ay = function(obj) {
- var i = this.length;
- while (i--) {
- if (this[i] === obj) {
- return true;
- }
- }
- return false;
- }
- var arr=new ActiveXObject('Scripting.FileSystemObject').OpenTextFile(WScript.Arguments.Item(0)).readall().split('\r\n');
- var re = /(\w+).*/ig;
- while (!WScript.StdIn.AtEndOfStream){
- var str = WScript.StdIn.Readline();
- arr.arr_ay(str.replace(re,'$1')) ? WSH.echo(str) : WSH.echo('')
- }
复制代码
增加个临时文件 看能否提高点效率- @echo off&setlocal enabledelayedexpansion
- findstr /ibng:测试2.txt 测试1.txt>$
- set n=2
- (for /f "tokens=1*delims=:" %%a in ($) do (
- for /l %%i in (!n!,1,%%a) do echo,
- echo %%b
- set /a n=%%a+2
- ))> 测试结果.txt
- del $
- pause
复制代码
再给个 三方的- @gawk "ARGIND==1{a[$0]=1}ARGIND>1{if (a[$1]){print $0}else{print a[$1]}}" 测试2.txt 测试1.txt >测试结果.txt
复制代码
作者: CrLf 时间: 2015-1-5 14:55
如果只是用来检查文本有哪些不同,而不一定要输出 txt 的话,也可以使用 BeyondCompare,比较直观,用很久了,用来对比 code 妥妥的,妈妈再也不用担心我不知道改了什么地方了
作者: pengyou86 时间: 2015-1-5 21:47
@if(0)==(0) echo off
cscript -nologo -e:javascript %0<测试1.txt >测试结果.txt "测试2.txt"
pause&goto :eof
@end
Array.prototype.arr_ay = function(obj) {
var i = this.length;
while (i--) {
if (this[i] === obj) {
return true;
}
}
return false;
}
var arr=new ActiveXObject('Scripting.FileSystemObject').OpenTextFile(WScript.Arguments.Item(0)).readall().split('\r\n');
var re = /(\w+).*/ig;
while (!WScript.StdIn.AtEndOfStream){
var str = WScript.StdIn.Readline();
arr.arr_ay(str.replace(re,'$1')) ? WSH.echo(str) : WSH.echo('')
}
测试就这个好用 谢谢各位 感谢大家的帮忙
作者: pengyou86 时间: 2015-1-5 21:47
两个都不能使用吗
大文件个话 下面这段能否处理呢增加个临时文件 看能否提高点效率再给个 三方的
terse 发表于 2015-1-5 12:19
谢谢你
作者: 系托 时间: 2015-1-6 22:26
多是高手啊!我多不知道咋回事?
作者: shelluserwlb 时间: 2015-1-8 20:17
本帖最后由 shelluserwlb 于 2015-1-8 20:34 编辑
你这个数据很多的话完全可以放在excel中用VBA实现的
将“测试1”放到 sheet1 中分成两列(A列和B列),将"测试2"放到 sheet2 (A列)中,再运行下面的代码,结果就会出现在"sheet3"中了。- Sub a()
- Dim n1, n2 As Integer
- Dim index1, index2 As String
- Dim vlue1, vlue2 As String
- n1 = WorksheetFunction.CountA(Worksheets("sheet1").Columns(1))
- n2 = WorksheetFunction.CountA(Worksheets("sheet2").Columns(1))
- index1 = 1
- Do While index1 <= n1
- vlue1 = Worksheets("sheet1").Cells(index1, 1)
- index2 = 1
- Do While index2 <= n2
- vlue2 = Worksheets("sheet2").Cells(index2, 1)
- If vlue1 = vlue2 Then
- Worksheets("Sheet1").Cells(index1, 1).Copy _
- Destination:=Worksheets("Sheet3").Cells(index1, 1)
- Worksheets("Sheet1").Cells(index1, 2).Copy _
- Destination:=Worksheets("Sheet3").Cells(index1, 2)
- Exit Do
- End If
- index2 = index2 + 1
- Loop
- index1 = index1 + 1
- Loop
- MsgBox "操作成功!"
- End Sub
复制代码
作者: cjiabing 时间: 2015-1-13 23:56
本帖最后由 cjiabing 于 2015-1-14 00:05 编辑
- @echo off&setlocal EnableDelayedExpansion
- set line=18
- ::设置总行数
-
-
- echo;开始搜索 . . .
- cd.>搜索结果.txt
- >>搜索结果.txt findstr/ng:测试2.txt 测试1.txt
- >>搜索结果.txt echo %line%:
-
-
- echo;开始整理 . . .
- cd.>测试结果.txt
- (
- for /f "tokens=1* delims=:" %%a in (搜索结果.txt) do if not "%%a"=="" (
- if not "!var!"=="" (set /a num=%%a-!var!-1) else set /a num=%%a-1
- if not "!num!"=="" for /l %%i in (1,1,!num!) do echo;
- echo;%%b
- set var=%%a
- ) else (
- set /a num=%line%-!var!-1
- for /l %%i in (1,1,!num!) do echo;
- )
- )>>测试结果.txt
- echo;
- echo;任务结束。
- echo;
- pause
- del 搜索结果.txt
复制代码
没试过几十万行的,估计要很久很久很久……
先搜索结果,再整理格式位置,效率可能高点——猜测而已,你可以做做试试!~
整理部分主要考虑了开头和结尾空格问题,如果不用考虑可以稍微简化条件判断if部分
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |