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

[文本处理] 批处理如何查找/提取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

这么大的文件只能先 sort 再逐行对比了

TOP

谢谢版主老大,能给范例吗?寻着解决方法找到这里来,批处理不熟悉还请明示一下。谢谢!

TOP

  1. @echo off
  2. (for /f "tokens=1* delims=," %%a in ('sort 1.txt') do (
  3.    set str=%%a
  4.    setlocal enabledelayedexpansion
  5.    if !last!==!str! echo !str!,%%b
  6.    endlocal
  7.    set last=%%a
  8. ))>重复.txt
复制代码

TOP

本帖最后由 yyykkkyyyy 于 2011-11-25 17:24 编辑

每种重复的都要抠一条吧
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1* delims=," %%a in ('sort a.txt')do (title %%a,%%b
  3.    if "%%a"=="!str1!" (echo !str2!&set f=y)else (
  4.       if defined f (set f=&echo !str2!)
  5.       set str1=%%a)
  6.    set str2=%%a,%%b)
  7. if defined f echo.!str2!
  8. )>b.txt
复制代码

TOP

版主老大好人,用你上面的代码处理7MB的文件10几分钟都还没有结束,处理过程中也没有提示。单个230K的文件速度倒是好快。。。

TOP

用临时文件就快了,前两行可做如下改动:
  1. @echo off
  2. sort a.txt /o tmp.txt
  3. (for /f "tokens=1* delims=," %%a in (tmp.txt) do (
  4. ...
复制代码

TOP

回复 6# jeeee

呵呵,我写的又繁又慢,但帮你每种多弄了一条记录也算好人吧, 还是不需要那一条 ? 被直接无视了

TOP

  1. @set @n=0//&cscript.exe -e:jscript "%~f0"&exit /b
  2. file = "a.txt";
  3. strConnect = 'Provider=Microsoft.Jet.OLEDB.4.0;Data Source=.;'
  4.     + 'Extended Properties="text;HDR=no;FMT=Delimited;";';
  5. AdoCnn = new ActiveXObject("ADODB.Connection");
  6. AdoCnn.Open(strConnect);
  7. //AdoCnn.Execute("Select * into [result.csv] FROM ["+file+"] where [F1] in (select [F1] from ["+file+"] group by [F1] having count([F1])>1)");
  8. AdoRs = new ActiveXObject("ADODB.Recordset");
  9. AdoRs.Open("SELECT * FROM ["+file+"] where [F1] in (select [F1] from ["+file+"] group by [F1] having count([F1]) > 1)", AdoCnn, 3);
  10. n = AdoRs.RecordCount
  11. s = AdoRs.GetString(2, n, ",", "\r\n");
  12. AdoRs.Close();
  13. AdoCnn.Close();
  14. fso = new ActiveXObject("Scripting.FileSystemObject");
  15. fso.OpenTextFile('result.txt', 2, true).write(s);
  16. WScript.Echo("共有"+n+"条重复数据,结果保存在result.txt");
复制代码
3

评分人数

    • zqz0012005: 谁说没人用JS?这位就是高手PB + 20 技术 + 2
    • jeeee: 速度非常快技术 + 1
    • CrLf: 乐于助人技术 + 1

TOP

回复 8# yyykkkyyyy


这个正是要的结果,谢了,不过处理7MB的数据快要20分钟了,能快点就完美了

TOP

回复 10# jeeee


    你这是回复谁呢?

TOP

回复 9# powerbat


  代码运行好快有提示,不过运行出来的结果好像有重复不知道为什么。请看图片。第13行找到的数据和7792行数据是一样重复了

TOP

回复 7# CrLf


   谢谢版主老大。高人真多困扰了几天时间一下子就解决了这里真是一个学习的好地方,学无止境啊!

TOP

回复  jeeee


    你这是回复谁呢?
powerbat 发表于 2011-11-26 00:56


    抱歉给你的回复在12楼,谢谢

TOP

回复 12# jeeee


你的意思是多条重复数据只记录一次吧?
好办,select * 改成 select DISTINCT  *
1

评分人数

    • jeeee: 热心助人为乐技术 + 1

TOP

返回列表