Board logo

标题: [文本处理] [已解决]求助纯批处理做文本行内移位排列 [打印本页]

作者: zhangzsky    时间: 2018-5-7 21:07     标题: [已解决]求助纯批处理做文本行内移位排列

本帖最后由 zhangzsky 于 2018-5-9 13:29 编辑
  1. 编号,79,9,29,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空
  2. 编号,224,40,155,空,空,空,空,空,空,空,45,34,空,空,空,空,空,空,空,空
  3. 编号,136,119,11,196,空,空,空,空,空,42,118,75,空,空,空,空,空,空,空
复制代码
文本"1.txt"如上.行数比较多,只处理的是第二行
文本"1.txt"主要是三部分组成:
1是编号二字.
2是编号后的10个数值,暂称前十
3是编号后的10个数值之后的10个数值,也就是编号后第十一个往后的10个.暂称后十

求教:
如何判断后十的数值中,第一个不是空.就将这个值排在前十的数值后面,替代空这个字符.
并且后十的第二个值往前排,放在后十的第一位,后面的以此类推往前排.保持三部分组成格式不变
达到的效果:
  1. 编号,79,9,29,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空,空
  2. 编号,224,40,155,45,空,空,空,空,空,空,34,空,空,空,空,空,空,空,空,空
  3. 编号,136,119,11,196,空,空,空,空,空,42,118,75,空,空,空,空,空,空,空
复制代码

作者: zhangzsky    时间: 2018-5-7 21:10

本帖最后由 zhangzsky 于 2018-5-7 22:26 编辑

标题实在不知道该怎么叫好了...望见谅
话说自己已经实现了,大致思路是先For读出了20个变量.
然后依次判断了前10每个的变量是不是空...是空就替换...一旦替换后再收拾后十个的排序...但是这样码超级的长...
作者: /zhqsystem/zhq    时间: 2018-5-8 04:06

  1. @Echo Off
  2. SetLocal EnableDelayedExpansion
  3. for /f "delims=" %%i in ('type "1.txt"')do (
  4. set "a=0"
  5. set "Error="
  6. for /f "tokens=11,* delims=," %%g in ("%%i")do if /i not "%%g"=="空" set "Error=1"&&set "#12=%%h"&&for %%z in (%%i)do set/a "a+=1"&&set "#!a!=%%z"
  7. if defined Error call:1
  8. if defined Error call:2
  9. if defined Error echo,!new!
  10. if not defined Error echo,%%i
  11. )
  12. pause
  13. goto:eof
  14. :1
  15. for /l %%n in (1,1,10)do if /i "!#%%n!"=="空" set "#%%n=!#11!"&&set "#11=空"&&goto:eof
  16. goto:eof
  17. :2
  18. set "new=!#1!"
  19. for /l %%n in (2,1,20)do set "new=!new!,!#%%n!"
  20. goto:eof
复制代码

作者: yhcfsr    时间: 2018-5-8 17:47

  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1,* delims=," %%a in ('type 1.txt') do (
  3. set "n="
  4. for %%i in (%%b) do set/a n+=1&&set "_c!n!=%%i"
  5. if "!_c11!" equ "空" (echo;%%a,%%b) else (
  6. if "!_c10!" neq "空" (echo;%%a,%%b) else (
  7. set "i="
  8. for /l %%i in (10,-1,1) do if "!_c%%i!" neq "空" if not defined i set/a "i=1+%%i"
  9. if defined i set "_c!i!=!_c11!"&set "_c11="
  10. set "str="
  11. for /l %%i in (1,1,20) do if defined _c%%i set "str=!str!,!_c%%i!"
  12. echo;%%a!str!,空
  13. ))
  14. ))>out.txt
  15. pause
复制代码
原理说明:按行扫描,以“,”分隔建立列变量,排除首列“编号”
如果第11列为空,直接输出;
如果第11列不为空,且第10列不为空,直接输出;
非以上情况,从后向前,判断前10数据第一次出现非空数据,记录索引号,将该索引号后的“空”赋值为第11列数据,并清除第11列数据。输出该行所有数据,并在末尾添加“空”。
作者: zhangzsky    时间: 2018-5-9 13:29

谢谢,问题解决了.




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