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

回复 45# 66899981

用24楼代码(其中改用 1.txt)测试结果》
发现 1.txt 文件中有 几个匹配字段形如
Q161109
Q140681
Q162834
Q163257
Q164277
Q161149
Q210073
如果删除这个前缀 Q 字符,重新存盘 1.txt, 测试全部通过,运行时间约2分钟,结果文件 data.txt 最终变为73行,其中每行均包含有 Q 字符前缀匹配数的数据行。

TOP

回复  66899981

用24楼代码(其中改用 1.txt)测试结果》
发现 1.txt 文件中有 几个匹配字段形如
Q1 ...
aloha20200628 发表于 2024-10-29 23:39

谢谢哥们的帮助

TOP

本帖最后由 aloha20200628 于 2024-10-30 12:13 编辑

回复 47# 66899981

用45楼提供的实况数据样本data.txt和1.txt做了一个反向测试,验证结果与用24楼代码的运行结论完全一致》即1.txt文件中的匹配数完全覆盖了data.txt文件中每行的第2列字段,因此运行结果是data.txt中的所有行全部被删除...

以下这段反向测试代码的简要说明》先提取data.txt文件中每行头部字段至临时文件0.0,再用gawk.exe对0.0文件去重,结果剩余5904行存为_data.txt(即data.txt文件中不重复的所有第2列字段),再用find.exe与1.txt中的每组数匹配,汇总匹配行总数m和未匹配行总数n,其中m值即data.txt文件中应被删除行数,n值即data.txt文件中应被保留行数

代码中的 gawk.exe 可从本坛第三方下载 http://bcn.bathome.net/s/tool/index.html?key=gawk
测试代码运行用时约1分钟...

  1. @echo off &(for /f "tokens=2 delims=|" %%a in (data.txt) do echo,%%a)>0.0
  2. gawk.exe "{if(++a[$0]==1)print $0}" 0.0>_data.txt
  3. del/q "0.0" &set/a "m=0,n=0" &for /f "delims=" %%a in (_data.txt) do (
  4. find /i "|%%a|" "1.txt" && set/a "m+=1" || set/a "n+=1"
  5. )>nul 2>nul
  6. echo,应被删除行总数=%m%,应被保留行总数=%n%
  7. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-30 15:21 编辑


根据45楼提供的实况数据样本data.txt和1.txt,用34楼的新算法重写了如下代码,先用 jscript 把 1.txt(共有10512组匹配数,94612个字符)分成了总共12行的临时文件 0.1,其中每行至多 900 组匹配数不超过8K字符量(尽量趋近 findstr 命令行参数长度极限),再用以下代码跑一遍,其结果虽与24楼代码的运行结果完全相同,但提速极为显著,用时不足2秒,而24楼代码用时约2分钟...
  1. @set @x=1 /* &@echo off
  2. type "1.txt"|cscript /nologo /e:jscript "%~f0">0.1
  3. for /f "delims=" %%a in (0.1) do (
  4. findstr /lv "%%a" data.txt>0.0
  5. move /y 0.0 data.txt
  6. )>nul 2>nul
  7. del/q "0.1" &pause&exit/b */
  8. a=WSH.stdin.readall().split(' ');
  9. for (n=0,l=a.length; n<l; n+=900)
  10.      WSH.echo(a.slice(n,n+900).join(' '));
  11. WSH.quit();
复制代码

TOP

返回列表