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

[文本处理] 【已解决】批处理如何求得每行数值的未出现数?

本帖最后由 思想之翼 于 2023-7-7 18:10 编辑

文本记录数值为
EA=000 001
BB=002 005 006 999
...
AA=000 003 998

问题:如何求每行“=”右侧数值的未出现数(000~999)

结果为
EA=002 003...998 999
BB=000 001 003 004 007...998
...
AA=001 002 004...999
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

  1. @echo off
  2. (for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.     setlocal enabledelayedexpansion
  4.     for %%i in (%%b) do (
  5.         set n=%%i
  6.         set /a n=n
  7.         set _!n!=true
  8.     )
  9.     set /p str=%%a=<nul
  10.     for /l %%j in (0,1,999) do (
  11.         if not defined _%%j (
  12.             set m=00%%j
  13.             set m=!m:~-3!
  14.             set /p str=!m! <nul
  15.         )
  16.     )
  17.     echo,
  18.     endlocal
  19. ))>b.txt
  20. pause
复制代码
1

评分人数

TOP

突然想起前几天的一个类似的帖子中,Batcher老大说处理后行的最后面多了个逗号,2楼代码同样每行最后多出了一个空格,如果要求严谨的话可以这样:
  1. @echo off
  2. (for /f "tokens=1* delims==" %%a in (a.txt) do (
  3.     setlocal enabledelayedexpansion
  4.     for %%i in (%%b) do (
  5.         set n=%%i
  6.         set /a n=n
  7.         set _!n!=true
  8.     )
  9.     set /p str=%%a=<nul
  10.     for /l %%j in (0,1,999) do (
  11.         if not defined _%%j (
  12.             set /p str=!m! <nul
  13.             set m=00%%j
  14.             set m=!m:~-3!
  15.         )
  16.     )
  17.     set /p str=!m!<nul
  18.     echo,
  19.     endlocal
  20. ))>b.txt
  21. pause
复制代码
1

评分人数

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /L %%i in (1000 1 1999) do set "str=!str! %%i"
  4. set "str=!str: 1= !"
  5. (for /f "tokens=1* delims==" %%i in (1.txt) do (
  6.         set "s=!str!"
  7.         for %%k in (%%j) do set "s=!s: %%k=!"
  8.         echo;%%i=!s:~1!
  9. )) > 2.txt
  10. pause
复制代码
1

评分人数

TOP

回复 1# 思想之翼
  1. gawk -F"[ =]+" -v BINMODE="w" "BEGIN{for(i=0;i<1000;i++)a[i]=sprintf(\"\04503d\",i)}{for(i=1;i<=NF;i++)b[$i];c=$1\"=\";for(i=0;i<1000;i++)if(!(a[i] in b))c=c a[i]\" \";sub(/ $/,\"\",c);print c;delete b}" a.txt>b.txt
复制代码
1

评分人数

TOP

建议楼主把测试后采用的最佳方案说一下
我看你好几个贴都没指出最终方案

QQ 20147578

TOP

本帖最后由 思想之翼 于 2023-7-7 21:28 编辑

回复 6# czjt1234
您好!几个方案皆出现乱码(格式为 Windows(CRLF) UTF-16LE),正在自查原因。

TOP

回复 7# 思想之翼


    txt和bat都改成ANSI试试
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 思想之翼 于 2023-7-8 00:13 编辑

回复 8# Batcher
txt和bat的内容没有中文,UTF-8改成ANSI后保存,再次打开依然是Windows(CRLF) UTF-8格式。
奇怪啊,5#gawk方案,txt行数小于等于19行,结果正常(格式为 Unix(LF) UTF-8)。

TOP

回复 7# 思想之翼


    你可以把测试出现乱码的 txt 文件放到网盘,分享链接,让大家帮你找原因。

TOP

回复 9# 思想之翼


    UTF-8改成ANSI后保存,不要再打开了,直接执行脚本
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复 9# 思想之翼


    你的ANSI是啥,不会是英文系统吧

QQ 20147578

TOP

感谢各位老师热心帮助!问题已解决。乱码原因是:各文件夹内文件多头输入,来源庞杂,格式混乱。4#5#代码简洁,速度快。3#代码速度稍逊。

TOP

返回列表