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

[文本处理] 批处理如何删除TXT多个字符串指定行?

|4| |20| |26| |70| |07|  。。。 后面可能有6000个这样格式的数据,只要TXT内容包含|4|这种格式的就删除整行
  1. @echo off
  2. for %%1 in (data.txt)do (findstr /v  "|4| |20| |26| |70| |07|" "%%1">#
  3. move "#" "%%1">nul 2>nul
  4. )
复制代码
之前这么写 但是|4| |20| |26| |70| |07|这样的格式有限制 例如100个以上就不行了

本帖最后由 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

本帖最后由 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

回复  66899981

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

谢谢哥们的帮助

TOP

本帖最后由 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楼代码第4行改为 exit/b */ 即可...
aloha20200628 发表于 2024-10-28 12:33




https://wwnl.lanzoul.com/iJsGD2dos9jg  我上传的网盘里了   1.TXT就是匹配  删除DATA.TXT里整行

TOP

回复  66899981

24楼代码第4行改为 exit/b */ 即可...
aloha20200628 发表于 2024-10-28 12:33



哥们你好,今天我有测试检测匹配数超长字符串里面有4000多条  然后最后的结果就是 DATA.txt 变成空数据了

TOP

回复  66899981

24楼代码第4行改为 exit/b */ 即可...
aloha20200628 发表于 2024-10-28 12:33



    感谢!完美!

TOP

回复 39# 66899981

24楼代码第4行改为 exit/b */ 即可...

TOP

回复  66899981

《批处理之家》几十年不倒,虽然解答者来来去去,但总有一些无私者 助人为乐,接棒加油 ...
aloha20200628 发表于 2024-10-28 12:03



    感谢!

TOP

回复 38# 66899981

《批处理之家》几十年不倒,虽然解答者来来去去,但总有一些无私者 助人为乐,接棒加油,让这个论坛的座右铭 ‘批处理—化繁为简,提高工作效率’ 闪闪发光。每日练练脑力操,帮人利己,能收获一点儿多巴胺和内分肽,也不错...

TOP

回复  66899981

24楼代码第2行改为如下样子即可取消cscript商标信息...24楼代码已订正,可取消cscript商 ...
aloha20200628 发表于 2024-10-28 11:12



    最后一个问题,这个能不能执行完自动关闭

TOP

回复  66899981

24楼代码第2行改为如下样子即可取消cscript商标信息...24楼代码已订正,可取消cscript商 ...
aloha20200628 发表于 2024-10-28 11:12




真是太感谢了,要是在一个城市多少要聚聚喝两杯

TOP

本帖最后由 aloha20200628 于 2024-10-28 11:20 编辑

回复 36# 66899981

24楼代码第2行改为如下样子即可取消cscript商标信息...
  1. type "data.txt"|cscript /nologo /e:jscript "%~f0" "1.txt">0.0
复制代码
24楼代码已订正,可取消cscript商标信息报告,但其中的 "1.txt" 文件名取舍还要楼主自定...

TOP

回复  66899981

别急!鼓捣软件数据这种活儿就得要足够的耐心和细心...
用29楼的方法流程再跑一遍24楼 ...
aloha20200628 发表于 2024-10-28 10:22



    还真可以了,DATA.txt  里面总是增加 Microsoft (R) Windows Script Host Version 5.812
版权所有(C) Microsoft Corporation。保留所有权利。如何不增加这句呢?

TOP

返回列表