标题: [文本处理] 【已解决】批处理如何将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 编辑
效率不高。。。- @echo off
- (for /f "tokens=1*delims==" %%i in (a.txt) do (
- setlocal enabledelayedexpansion
- for %%a in (%%j) do set .%%a=1
- for /f "delims==" %%a in ('set .') do (
- set "a=%%a" & set "a=!a:.=1!"
- set /a "1/(a-b-1)"2>nul&&set "s=!s!!b! "||set "s=!s!!b!-"
- set "b=!a!"
- )
- for %%a in (!s!!a!) do (
- set "str=%%a"
- if "!str:-=!" neq "!str!" (
- set /a m=!str:~,3!-100,n=!str:~-3!-100
- set "str=!m!-!n!"
- ) else set /a str-=100
- set "str1=!str1! !str!
- )
- echo,%%i=!str1:~1!,
- endlocal
- ))>b.txt
- pause
复制代码
作者: terse 时间: 2013-10-7 15:44
- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims==," %%a in (a.txt) do (
- set min=&set arr=&set "var=%%b"
- set "var=!var: = !"
- for %%c in (!var!) do (
- for /f %%c in ("!var!") do (
- for /f "tokens=1*" %%i in ("!var:,=!") do (
- set "str=%%i"
- for %%k in (%%j) do if %%k lss !str! set str=%%k
- set /a s=1!str!%%100
- if defined min (
- set/a x=s-n
- if !x! neq 1 (
- if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
- set min=!s!&set max=
- ) else set max=!s!
-
- ) else set min=!s!
- set n=!s!
- for %%k in (!str!) do set "var= !var: %%k =!"
- )
- )
- )
- if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
- for /f "tokens=*" %%i in ("!arr!") do echo %%a=%%i,
- )
- pause
复制代码
作者: 思想之翼 时间: 2013-10-7 15:45
回复 4# apang
感谢帮助。问题基本解决,只是每行数据的末尾,仅去掉“,”前的空格,仍需保留“,”本身。如何加上“,”?
作者: terse 时间: 2013-10-7 16:15
本帖最后由 terse 于 2013-10-7 16:33 编辑
效率提升点不
添加一个 set n=10000000的变量- @echo off&setlocal enabledelayedexpansion
- if "%~1" == "" (
- (for /f "tokens=1,2*" %%a in ('%~s0 $ ^| sort') do (
- for /f "tokens=* delims=0" %%i in ("%%b") do (
- if "%%i" == "a" (
- if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
- for /f "tokens=*" %%m in ("!arr!") do echo %%c=%%m,
- set arr=&set n=
- ) else (
- if defined n (
- set/a n=%%i-n
- if !n! neq 1 (
- if defined max (set arr=!arr! !min!-!max!) else set arr=!arr! !min!
- set min=%%i&set max=
- ) else set max=%%i
- ) else set min=%%i
- set n=%%i
- )
- )
- ))>b.txt
- exit
- ) else (
- set n=10000000
- for /f "tokens=1* delims==" %%a in (a.txt) do (
- set /a n+=1
- for %%i in (%%b) do if not defined !n!_%%i echo !n! %%i&set !n!_%%i=a
- echo !n! a %%a
- )
- )
复制代码
作者: apang 时间: 2013-10-7 16:17
回复 6# 思想之翼
已修改,试下
作者: foxJL 时间: 2013-10-8 16:27
两位的代码用这个文本测试会出错- 1 2= 98 97 96 06 07 08 05 03 02 10 ,
- 1 2= 98 97 96 06 07 08 05 03 02 10 ,
- 1 2= 98 97 96 06 07 08 05 03 02 10 ,
- 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 编辑
不会怎么排序,练练手- @echo off&setlocal enabledelayedexpansion
- for /f "tokens=1* delims==" %%i in (a.txt) do (
- for %%k in (%%j) do (set /a n=1%%k%%100 && set !n!=$)
- set "a="
- set/p=%%i=<nul
- for /l %%m in (1,1,100) do (if !%%m!==$ (set a=!a!-%%m) else (set a=!a! )
- set %%m=)
- for %%o in (!a!) do (set s=%%o&set s=!s:~1,50!&set s=!s:-= !
- set s1=!s:~0,2!&set s2=!s:~-3!&set s1=!s1: =!&set s2=!s2: =!
- if not !s1! equ !s2! (set/p=!s1!-!s2! <nul) else (set/p=!s1! <nul)
- )
- echo.
- )
- pause>nul
复制代码
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |