Board logo

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

作者: 思想之翼    时间: 2023-7-7 03:16     标题: 【已解决】批处理如何求得每行数值的未出现数?

本帖最后由 思想之翼 于 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
作者: qixiaobin0715    时间: 2023-7-7 09:11

  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
复制代码

作者: qixiaobin0715    时间: 2023-7-7 09:27

突然想起前几天的一个类似的帖子中,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
复制代码

作者: WHY    时间: 2023-7-7 09:45

  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
复制代码

作者: hfxiang    时间: 2023-7-7 11:28

回复 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
复制代码

作者: czjt1234    时间: 2023-7-7 16:27

建议楼主把测试后采用的最佳方案说一下
我看你好几个贴都没指出最终方案
作者: 思想之翼    时间: 2023-7-7 18:07

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

回复 6# czjt1234
您好!几个方案皆出现乱码(格式为 Windows(CRLF) UTF-16LE),正在自查原因。
作者: Batcher    时间: 2023-7-7 22:06

回复 7# 思想之翼


    txt和bat都改成ANSI试试
作者: 思想之翼    时间: 2023-7-7 23:59

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

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

回复 7# 思想之翼


    你可以把测试出现乱码的 txt 文件放到网盘,分享链接,让大家帮你找原因。
作者: Batcher    时间: 2023-7-8 14:02

回复 9# 思想之翼


    UTF-8改成ANSI后保存,不要再打开了,直接执行脚本
作者: czjt1234    时间: 2023-7-8 14:41

回复 9# 思想之翼


    你的ANSI是啥,不会是英文系统吧
作者: 思想之翼    时间: 2023-7-8 18:09

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




欢迎光临 批处理之家 (http://bbs.bathome.net/) Powered by Discuz! 7.2