标题: [文本处理] 批处理如何查找/提取txt文本里第一列内容相同的行 [打印本页]
作者: jeeee 时间: 2011-11-25 13:58 标题: 批处理如何查找/提取txt文本里第一列内容相同的行
本帖最后由 pcl_test 于 2016-11-25 08:26 编辑
有一个文本是TXT由多个TXT文档合并来,有7MB之多,因为里面有很多重复的数据想把重复数据筛选出来,请问这个代码该如何写》?
文本样式:
A.TXT
ADLL51A111110092,2011/11/21,14:51:19
AGCCDPC111110092,2011/11/21,14:51:24
AGCJDPB111110086,2011/11/21,14:51:32
ADC10Z111110096,2011/11/21,14:51:33
ADLL51A111110043,2011/11/21,14:55:10
AGCCDPC111110043,2011/11/21,14:55:11
AGCJDPB111110028,2011/11/21,14:55:12
ADLL51A111110092,2011/11/21,14:55:13
ADLL51A111110017,2011/11/21,14:55:18
其中红色是出现重复的,时间日期忽略不计,筛选结果输出到B.TXT告诉那些是相同代码。谢谢!
输出到B.TXT格式
ADLL51A111110092,2011/11/21,14:51:19
ADLL51A111110092,2011/11/21,14:55:13
作者: CrLf 时间: 2011-11-25 14:00
这么大的文件只能先 sort 再逐行对比了
作者: jeeee 时间: 2011-11-25 14:11
谢谢版主老大,能给范例吗?寻着解决方法找到这里来,批处理不熟悉还请明示一下。谢谢!
作者: CrLf 时间: 2011-11-25 14:19
- @echo off
- (for /f "tokens=1* delims=," %%a in ('sort 1.txt') do (
- set str=%%a
- setlocal enabledelayedexpansion
- if !last!==!str! echo !str!,%%b
- endlocal
- set last=%%a
- ))>重复.txt
复制代码
作者: yyykkkyyyy 时间: 2011-11-25 17:13
本帖最后由 yyykkkyyyy 于 2011-11-25 17:24 编辑
每种重复的都要抠一条吧- @echo off&setlocal enabledelayedexpansion
- (for /f "tokens=1* delims=," %%a in ('sort a.txt')do (title %%a,%%b
- if "%%a"=="!str1!" (echo !str2!&set f=y)else (
- if defined f (set f=&echo !str2!)
- set str1=%%a)
- set str2=%%a,%%b)
- if defined f echo.!str2!
- )>b.txt
复制代码
作者: jeeee 时间: 2011-11-25 17:52
版主老大好人,用你上面的代码处理7MB的文件10几分钟都还没有结束,处理过程中也没有提示。单个230K的文件速度倒是好快。。。
作者: CrLf 时间: 2011-11-25 18:16
用临时文件就快了,前两行可做如下改动:- @echo off
- sort a.txt /o tmp.txt
- (for /f "tokens=1* delims=," %%a in (tmp.txt) do (
- ...
复制代码
作者: yyykkkyyyy 时间: 2011-11-25 19:33
回复 6# jeeee
呵呵,我写的又繁又慢,但帮你每种多弄了一条记录也算好人吧, 还是不需要那一条 ? 被直接无视了
作者: powerbat 时间: 2011-11-25 22:33
- @set @n=0//&cscript.exe -e:jscript "%~f0"&exit /b
-
- file = "a.txt";
-
- strConnect = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.;'
- + 'Extended Properties="text;HDR=no;FMT=Delimited;";';
- AdoCnn = new ActiveXObject("ADODB.Connection");
- AdoCnn.Open(strConnect);
- //AdoCnn.Execute("Select * into [result.csv] FROM ["+file+"] where [F1] in (select [F1] from ["+file+"] group by [F1] having count([F1])>1)");
- AdoRs = new ActiveXObject("ADODB.Recordset");
- AdoRs.Open("SELECT * FROM ["+file+"] where [F1] in (select [F1] from ["+file+"] group by [F1] having count([F1]) > 1)", AdoCnn, 3);
- n = AdoRs.RecordCount
- s = AdoRs.GetString(2, n, ",", "\r\n");
- AdoRs.Close();
- AdoCnn.Close();
- fso = new ActiveXObject("Scripting.FileSystemObject");
- fso.OpenTextFile('result.txt', 2, true).write(s);
- WScript.Echo("共有"+n+"条重复数据,结果保存在result.txt");
复制代码
作者: jeeee 时间: 2011-11-26 00:42
回复 8# yyykkkyyyy
这个正是要的结果,谢了,不过处理7MB的数据快要20分钟了,能快点就完美了
作者: powerbat 时间: 2011-11-26 00:56
回复 10# jeeee
你这是回复谁呢?
作者: jeeee 时间: 2011-11-26 00:56
回复 9# powerbat
代码运行好快有提示,不过运行出来的结果好像有重复不知道为什么。请看图片。第13行找到的数据和7792行数据是一样重复了
作者: jeeee 时间: 2011-11-26 00:59
回复 7# CrLf
谢谢版主老大。高人真多困扰了几天时间一下子就解决了这里真是一个学习的好地方,学无止境啊!
作者: jeeee 时间: 2011-11-26 01:02
回复 jeeee
你这是回复谁呢?
powerbat 发表于 2011-11-26 00:56
抱歉给你的回复在12楼,谢谢
作者: powerbat 时间: 2011-11-26 01:06
回复 12# jeeee
你的意思是多条重复数据只记录一次吧?
好办,select * 改成 select DISTINCT *
作者: jeeee 时间: 2011-11-26 01:21
本帖最后由 jeeee 于 2011-11-26 01:49 编辑
回复 jeeee
你的意思是多条重复数据只记录一次吧?
好办,select * 改成 select DISTINCT *
powerbat 发表于 2011-11-26 01:06
改好代码好用运行速度飞快,7MB的数据不到10秒出结果,不过把没有重复数据也找出来了,请再看看!红色是被找出的重复数据,黑色的是没有被重复的
PBFBEPA110610145,2011/5/22,22:34:35
PBFBEPA110610145,2011/5/22,22:36:13
PBFBEPA110750117,2011/8/1,22:12:01
PBFBEPA110750117,2011/8/1,22:12:04
PBFBEPB110220058,2011/3/27,5:02:00
PBFBEPB110220058,2011/3/27,5:02:11
PBFBEPB110240001,2011/3/13,3:23:32
PBFBEPB110240004,2011/3/13,3:27:18
PBFBEPB110240007,2011/3/13,3:22:06
PBFBEPB110240009,2011/3/13,3:29:24
PBFBEPB110240012,2011/3/20,3:57:53
PBFBEPB110240017,2011/3/13,3:18:50
PBFBEPB110240020,2011/3/13,3:20:20
PBFBEPB110240028,2011/3/20,0:36:58
PBFBEPB110240030,2011/3/20,0:37:37
PBFBEPB110240031,2011/3/20,0:38:10
PBFBEPB110240032,2011/3/20,0:39:44
PBFBEPB110240033,2011/3/13,3:24:02
PBFBEPB110240037,2011/3/13,3:21:43
PBFBEPB110240039,2011/3/20,23:20:47
PBFBEPB110240043,2011/3/20,23:18:07
PBFBEPB110240045,2011/3/20,23:11:49
PBFBEPB110240046,2011/3/20,5:31:22
PBFBEPB110240046,2011/3/20,23:11:35
PBFBEPB110240048,2011/3/13,3:25:39
PBFBEPB110240052,2011/3/20,23:14:16
PBFBEPB110240054,2011/3/13,3:16:51
PBFBEPB110240055,2011/3/13,3:28:01
PBFBEPB110240056,2011/3/13,3:14:37
PBFBEPB110240059,2011/3/13,3:13:48
作者: powerbat 时间: 2011-11-26 08:58
你原文件中的重复数据可能正好是整行内容完全相同,即除了第一列外日期部分也相同,所以过滤后只显示了一条结果。
你仔细看看是不是这样。
作者: yyykkkyyyy 时间: 2011-11-26 09:36
呵呵,高人多多, 显得回复我一句都欠妥,其实即便我水平低也还是有观点的。
本来嘛,bat也好 js也好 还是vbs也好,都是一家开发出来的,不知各位版主有何感慨,本版代码咨询与讨论,已经很明显 bat 因就DOS功能加以扩展,系统功能无论是规模还是速度,是比不过与系统结合更紧密的脚本的,我早就认为 批处理的优势在于它的短小精悍,powerbat 高手似乎启示我等——不要去钻批处理了,那玩意我是从那走到头了的
即便如此,bat 的生命力还是如此顽强,各高级语言开发了软件后仍不时会用它,如果说制作启动盘或研发新的 ... 我知道我的水平不配讨论此话题,只是有感而发
作者: jeeee 时间: 2011-11-26 10:41
本帖最后由 jeeee 于 2011-11-26 10:42 编辑
呵呵,高人多多, 显得回复我一句都欠妥,其实即便我水平低也还是有观点的。
本来嘛,bat也好 js也好 还是vb ...
yyykkkyyyy 发表于 2011-11-26 09:36
学无止境这才是乐趣,你提供的代码其实也达到了效果速度稍许慢而已,已经是我等菜鸟不可及的
作者: jeeee 时间: 2011-11-26 10:58
你原文件中的重复数据可能正好是整行内容完全相同,即除了第一列外日期部分也相同,所以过滤后只显示了一条 ...
powerbat 发表于 2011-11-26 08:58
是的有日期相同,不过二个数据之间的秒数最少间隔一秒。现在只能批处理去掉时间再过滤,是否能做到只找出相同数值,忽略后面的日期时间?
作者: powerbat 时间: 2011-11-26 11:44
回复 18# yyykkkyyyy
楼上的多心了,我只是看到8楼没有代码,以为楼主回复错了,没有细看,所以问了一下。
批处理是一个很常用的概念和技术,永远不可能过时。
但批处理bat脚本毕竟功能有限,有些事情虽然也可以完成,但效率就要大打折扣。
就好比要过滤文本中含有特定字符的行,单纯用cmd.exe的内部命令也可以实现(比如for /f 读取, 用!var!跟!var:str=!进行比较)
但有一些外部命令如find.exe/findstr.exe,甚至第三方工具如sed.exe/awk.exe等,做起来更完美、效率更高,为什么不去用它们呢?
用合适的工具做合适的事,也是一种技巧。
作者: powerbat 时间: 2011-11-26 11:52
回复 20# jeeee
现在就是这样做的。
你在原文件中搜索一下我的代码结果中你认为是非重复行的,比如“PBFBEPB110240001,2011/3/13,3:23:32”,看看原文件中有没有它的重复行。
或者你取部分数据压缩上传,以助于更好的分析。
作者: jeeee 时间: 2011-11-26 14:28
回复 jeeee
现在就是这样做的。
你在原文件中搜索一下我的代码结果中你认为是非重复行的,比如 ...
powerbat 发表于 2011-11-26 11:52
仔细看了一下合并的TXT似乎有一些乱码及中文字,我重新合并再试一下,单个文件包没有问题并且输出了正确的结果。测试后再报告结果谢谢
作者: jeeee 时间: 2011-11-26 16:51
回复 22# powerbat
老大出现抓狂的事,这个TXT文件一直报错:在此环境中允许操作!
请帮助分析!发现这个TXT数据后面的时间有部分是相同的会不会是这个原因?尝试将时间去掉也不行崩溃中
作者: powerbat 时间: 2011-11-26 21:32
这个文件中没有重复行。
s = AdoRs.GetString(2, n, ",", "\r\n");
改成
s = "";
if (n>0) s = AdoRs.GetString(2, n, ",", "\r\n");
作者: jeeee 时间: 2011-11-27 17:39
这个文件中没有重复行。
s = AdoRs.GetString(2, n, ",", "\r\n");
改成
s = "";
if (n>0) s = AdoRs.G ...
powerbat 发表于 2011-11-26 21:32
改好代码测试完美,非常感谢您的帮助
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |