找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 25257|回复: 4

[文本处理] [已解决]求助纯批处理做文本行内移位排列

[复制链接]
发表于 2018-5-7 21:07:58 | 显示全部楼层 |阅读模式
本帖最后由 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,空,空,空,空,空,空,空
复制代码
 楼主| 发表于 2018-5-7 21:10:43 | 显示全部楼层
本帖最后由 zhangzsky 于 2018-5-7 22:26 编辑

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

  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

复制代码
发表于 2018-5-8 17:47:37 | 显示全部楼层
  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列数据。输出该行所有数据,并在末尾添加“空”。
 楼主| 发表于 2018-5-9 13:29:11 | 显示全部楼层
谢谢,问题解决了.
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 06:28 , Processed in 0.022756 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表