Board logo

标题: [文本处理] 【已解决】批处理如何将txt文本每行数字按大小排序并将连续的数字按指定格式合并 [打印本页]

作者: 思想之翼    时间: 2013-10-7 13:23     标题: 【已解决】批处理如何将txt文本每行数字按大小排序并将连续的数字按指定格式合并

txt文本中有若干行数据,见附件。现在欲将每行“=”后的数据按大小排序,再将排序后的连续数据,用数据范围的方式表示。我毫无头绪,恳望得到帮助。

比如有一行数据:                 
1 2= 98 97 96 06 07 08 05 03 02 10 ,

1、先将“=”后的数据大小排序:
1 2= 02 03 05 06 07 08  10 96 97 98 ,

2、再将连续的数据用范围表示:
1 2= 02-03 05-08 10 96-98 ,

3、最后去除“=”后,以及“,”前的空格,数值前的“0”,最总表示为:
1 2=2-3 5-6 10 96-98,
作者: terse    时间: 2013-10-7 14:21

先确认下 样本里的数据是否都是统一的2位数?那样的话应该简单
作者: 思想之翼    时间: 2013-10-7 14:28

回复 2# terse

是的。感谢关注。
作者: apang    时间: 2013-10-7 15:37

本帖最后由 apang 于 2013-10-7 18:04 编辑

效率不高。。。
  1. @echo off
  2. (for /f "tokens=1*delims==" %%i in (a.txt) do (
  3.     setlocal enabledelayedexpansion
  4.     for %%a in (%%j) do set .%%a=1
  5.     for /f "delims==" %%a in ('set .') do (
  6.         set "a=%%a" & set "a=!a:.=1!"
  7.         set /a "1/(a-b-1)"2>nul&&set "s=!s!!b! "||set "s=!s!!b!-"
  8.         set "b=!a!"
  9.     )
  10.     for %%a in (!s!!a!) do (
  11.         set "str=%%a"
  12.         if "!str:-=!" neq "!str!" (
  13.             set /a m=!str:~,3!-100,n=!str:~-3!-100
  14.             set "str=!m!-!n!"
  15.         ) else set /a str-=100
  16.         set "str1=!str1! !str!
  17.     )
  18.     echo,%%i=!str1:~1!,
  19.     endlocal
  20. ))>b.txt
  21. pause
复制代码

作者: terse    时间: 2013-10-7 15:44

  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims==," %%a in (a.txt) do (
  3.     set min=&set arr=&set "var=%%b"
  4.     set "var=!var: =  !"
  5.     for %%c in (!var!) do (
  6.         for /f %%c in ("!var!") do (
  7.             for /f "tokens=1*" %%i in ("!var:,=!") do (
  8.                 set "str=%%i"
  9.                 for %%k in (%%j) do if %%k lss !str! set str=%%k
  10.                 set /a s=1!str!%%100
  11.                 if defined min (
  12.                    set/a x=s-n
  13.                    if !x! neq 1 (
  14.                       if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
  15.                       set min=!s!&set max=
  16.                    ) else set max=!s!
  17.                 ) else set min=!s!
  18.                   set n=!s!
  19.                   for %%k in (!str!) do set "var= !var: %%k =!"
  20.             )
  21.         )
  22.     )
  23.     if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
  24.     for /f "tokens=*" %%i in ("!arr!") do echo %%a=%%i,
  25. )
  26. pause
复制代码

作者: 思想之翼    时间: 2013-10-7 15:45

回复 4# apang
感谢帮助。问题基本解决,只是每行数据的末尾,仅去掉“,”前的空格,仍需保留“,”本身。如何加上“,”?
作者: terse    时间: 2013-10-7 16:15

本帖最后由 terse 于 2013-10-7 16:33 编辑

效率提升点不
添加一个 set n=10000000的变量
  1. @echo off&setlocal enabledelayedexpansion
  2. if "%~1" == "" (
  3.    (for /f "tokens=1,2*" %%a in ('%~s0 $ ^| sort') do (
  4.         for /f "tokens=* delims=0" %%i in ("%%b") do (
  5.             if "%%i" == "a" (
  6.                if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
  7.                for /f "tokens=*" %%m in ("!arr!") do echo %%c=%%m,
  8.                set arr=&set n=
  9.             ) else (
  10.                       if defined n (
  11.                          set/a n=%%i-n
  12.                          if !n! neq 1 (
  13.                             if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
  14.                             set min=%%i&set max=
  15.                          ) else set max=%%i
  16.                       ) else set min=%%i
  17.                         set n=%%i
  18.                    )
  19.         )
  20.    ))>b.txt
  21.   exit
  22. ) else (
  23.         set n=10000000
  24.         for /f "tokens=1* delims==" %%a in (a.txt) do (
  25.             set /a n+=1
  26.             for %%i in (%%b) do if not defined !n!_%%i echo !n! %%i&set !n!_%%i=a
  27.             echo !n! a %%a
  28.         )
  29. )
复制代码

作者: apang    时间: 2013-10-7 16:17

回复 6# 思想之翼


    已修改,试下
作者: foxJL    时间: 2013-10-8 16:27

两位的代码用这个文本测试会出错
  1. 1 2= 98 97 96 06 07 08 05 03 02 10 ,
  2. 1 2= 98 97 96 06 07 08 05 03 02 10 ,
  3. 1 2= 98 97 96 06 07 08 05 03 02 10 ,
  4. 1 2= 98 97 96 06 07 08 05 03 02 10 ,
复制代码

作者: apang    时间: 2013-10-8 16:48

回复 9# foxJL


    但附件为英文逗号
作者: foxJL    时间: 2013-10-8 16:52

回复 10# apang


    哦,不好意思,公司里面不能下载,没有下载附件测试
作者: foxJL    时间: 2013-10-8 17:24

本帖最后由 foxJL 于 2013-10-8 17:28 编辑

不会怎么排序,练练手
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f "tokens=1* delims==" %%i in (a.txt) do (
  3. for %%k in (%%j) do (set /a n=1%%k%%100 && set !n!=$)
  4. set "a="
  5. set/p=%%i=<nul
  6. for /l %%m in (1,1,100) do (if !%%m!==$ (set a=!a!-%%m) else (set a=!a! )
  7. set %%m=)
  8. for %%o in (!a!) do (set s=%%o&set s=!s:~1,50!&set s=!s:-=  !
  9. set s1=!s:~0,2!&set s2=!s:~-3!&set s1=!s1: =!&set s2=!s2: =!
  10. if not !s1! equ !s2! (set/p=!s1!-!s2! <nul) else (set/p=!s1! <nul)
  11. )
  12. echo.
  13. )
  14. pause>nul
复制代码





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