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

回复 1# 66899981

批处的胃口限于每行8K,无须让findstr喂食了...
  1. echo off &findstr /lv "|4|" data.txt>0.0
  2. move /y 0.0 data.txt
  3. pause&exit/b
复制代码
或改用 find 亦可...
  1. echo off &find /v "|4|" data.txt|more +2>0.0
  2. move /y 0.0 data.txt
  3. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-27 11:13 编辑

回复 3# 66899981

直接用 findstr 的 ‘逻辑或’ 匹配模式,可删除包含 |4| 或 |5| 或 |10000| 的数据行...
  1. echo off &findstr /lv "|4| |05| |10000|" data.txt>0.0
  2. move /y 0.0 data.txt
  3. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-27 11:29 编辑

回复 3# 66899981

或用以下方法,把 一长串匹配数 填入 for...() 里,遍历提取逐一删除...
  1. echo off & for %%k in (4 20 26 70 07) do (
  2.    find /v "|%%k|" data.txt|more +2>0.0
  3.    move /y 0.0 data.txt
  4. )
  5. pause&exit/b
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-27 21:46 编辑

回复 3# 66899981

又是一个猜谜帖...似乎是用findstr匹配多个 ‘|n|’ 组成的整个字符串长度超限了...

TOP

本帖最后由 aloha20200628 于 2024-10-27 16:03 编辑

回复 11# 66899981

以下代码存为 test.bat 运行,把整个匹配数字长串 |4| |20| |26| |70| |07| ... 存入 “匹配数超长字符串.txt” 这个单行文件,与 test.bat 和 data.txt 同目录即可...
运行结果会覆写源 data.txt,建议先备份源文件。
  1. @set @x=1 /* &@echo off
  2. type "匹配数超长字符串.txt"|cscript /e:jscript "%~f0" "data.txt"
  3. pause&exit/b */
  4. kwline=WSH.stdin.readall().replace('\r\n','').replace(/\|/g,'\\|');
  5. v=WSH.arguments, fso=WSH.createObject('Scripting.FileSystemObject');
  6. fp=fso.OpenTextFile(v(0),1), alltxt=fp.readall(), fp.close(), reg='/'+kwline+'/ig';
  7. fp=fso.OpenTextFile(v(0),2,true), fp.write(alltxt.replace(eval(reg),'')), fp.close(), WSH.quit();
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-27 16:17 编辑

回复 19# 66899981

简单作了一个测试》用8楼示例中的510组匹配数超长字符串
|000004| |000020| ... |605018| |605058|
直接写入(前后没有空格)单行文件 "匹配数超长字符串.txt",再用这个 510 组匹配数超长字符串 替换如下 “data.txt” 文件中包含的 * 字符:
  1. abc*xyz
  2. *xyz
  3. abc*
  4. *
  5. 123456
复制代码
运行17楼给出的 test.bat,结果是》源文件 data.txt 变为如下内容:
  1. abcxyz
  2. xyz
  3. abc
  4. 123456
复制代码
请楼主确认上述测试方法及其结果与要求是否一致?

TOP

本帖最后由 aloha20200628 于 2024-10-27 18:00 编辑

回复 21# 66899981

其实就是5楼代码的算法,只不过 for...() 括号里塞不进超长字符串而已,如下版本应该可以了(先借用js切碎超长字符串再回喂5楼代码,当然也可用js一锅烩 ),已用21楼示例文件测试通过...
以下代码存为 test.bat 运行,把整个匹配数超长字符串 |000004| |000020|...|605018| |605058| 存入 “匹配数超长字符串.txt” 这个单行文件,与 test.bat 和 data.txt 同目录即可... 运行结果会覆写源 data.txt,建议先备份源文件。
  1. @set @x=1 /* &@echo off
  2. type "匹配数超长字符串.txt"|cscript /e:jscript "%~f0">0.1
  3. for /f "delims=" %%k in (0.1) do (
  4. find /v "%%k" data.txt|more +2>0.0
  5. move /y 0.0 data.txt
  6. )>nul 2>nul
  7. del/q "0.1"&pause&exit/b */
  8. WSH.echo(WSH.stdin.readall().replace('\r\n','').replace(/ /g,'\r\n')), WSH.quit();
复制代码

TOP

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

回复 23# 66899981

重体力劳动让 js 一锅烩吧,比22楼版本明显提速...
  1. @set @x=1 /* &@echo off
  2. type "data.txt"|cscript /nologo /e:jscript "%~f0" "匹配数超长字符串.txt">0.0
  3. move /y 0.0 data.txt >nul 2>nul
  4. pause&exit/b */
  5. v=WSH.arguments, fso=WSH.createObject('Scripting.FileSystemObject');
  6. fp=fso.OpenTextFile(v(0),1), akw=fp.readall().replace(/\r\n/g,'').split(' '), fp.close();
  7. ws=WSH.stdin, lines='';
  8. while (!ws.atendofstream) {
  9.     line=ws.readline();
  10.     for (cut=0,n=0,l=akw.length; n<l; n++)
  11.         if (line.indexOf(akw[n]) != -1) { cut=1; break; }
  12.     if (cut==0) lines+=line+'\r\n';
  13. }
  14. WSH.echo(lines), WSH.quit();
复制代码

TOP

本帖最后由 aloha20200628 于 2024-10-27 22:53 编辑

回复 25# 66899981

此报错说明》在当前目录下没有找到 "匹配数超长字符串.txt" 这个文件

... 把整个匹配数超长字符串 |000004| |000020|...|605018| |605058| 存入 “匹配数超长字符串.txt” 这个单行文件,与 test.bat 和 data.txt 同目录,运行结果会覆写源 data.txt ...

TOP

本帖最后由 aloha20200628 于 2024-10-28 09:01 编辑

回复 27# 66899981

须把整个匹配数超长字符串 |000004| |000020| ... |605018| |605058|
直接写入(前后没有空格)单行文件
"匹配数超长字符串.txt"... 这是一个单行文件,不要分行!
用21楼的22组匹配数写入单行文件 "匹配数超长字符串.txt",再用2楼的示例文件 "data.txt",运行24楼代码,已经测试通过,获得了与楼主要求完全一致的结果...

TOP

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

回复 31# 66899981

别急!鼓捣软件数据这种活儿就得要足够的耐心和细心...
用29楼的方法流程再跑一遍24楼代码》先将 "匹配数超长字符串.txt" 这个单行文件更名为 "1.txt",再将24楼代码第二行中的 "匹配数超长字符串.txt" 改为 "1.txt",试试结果如何...

TOP

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


本帖挑战的不是算法,而是超长字符串数据量,批处为此下课了。
但如果超长字符串能被预先分成每行8K字符量以内的n个数据行存入一个文件(即每行至多8000个英文字符长度,行头行尾没有空格),例如名为1.txt,即可又让批处+findstr ‘满血复活’了,毕竟 findstr 是用c/c++打造的。
其实8楼已经验证了此方法的有效性,即如以下代码
  1. @echo off &for /f "delims=" %%a in (1.txt) do (
  2. findstr /lv "%%a" data.txt>0.0
  3. move /y 0.0 data.txt
  4. ) 2>nul
  5. pause&exit/b
复制代码

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

回复 38# 66899981

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

TOP

回复 39# 66899981

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

TOP

返回列表