Board logo

标题: [文本处理] 增强FOR语句的tokens-delims组合 [打印本页]

作者: amwfjhh    时间: 2015-1-21 14:53     标题: 增强FOR语句的tokens-delims组合

本帖最后由 amwfjhh 于 2015-1-21 15:05 编辑

我们知道在FOR语句里面,可以使用tokens和delims(非必须,提供默认值)组合来对一些格式化文本进行切割,但在默认状况下,delims的分割字符会将多个连续的分割字符合并成一个,这在有些情况下能够简化我们的操作以节省时间(如多个不定长度连续空格分割的字符串)。但有些情况下我们需要用分割字符串严格按照一个分割符一个变量的对应关系解析出来,形如下方的文本
1.txt
  1. 姓名,性别,语文,数学,英语,化学,物理,地理,历史,政治,总分
  2. 张三,男,98,89,78,,,,80,78,423
复制代码
如还按之前的解析的话,
  1. @echo off
  2. for /f "tokens=1-11 skip=1 delims=," %%a in (1.txt) do (
  3.   echo,姓名 : %%a
  4.   echo,性别 : %%b
  5.   echo,语文 : %%c
  6.   echo,数学 : %%d
  7.   echo,英语 : %%e
  8.   echo,化学 : %%f
  9.   echo,物理 : %%g
  10.   echo,地理 : %%h
  11.   echo,历史 : %%i
  12.   echo,政治 : %%j
  13.   echo,总分 : %%k
  14. )
  15. pause&goto :eof
复制代码
则历史,政治,总分所对应的数字则会被前移到化学,物理,地理三者的变量下,这显然不是我们希望的,请问各位这种情况在批处理你们又是如何处理的呢?
作者: amwfjhh    时间: 2015-1-21 15:11

抛砖引玉一下:
一、详细分割前先用set替换在,前插入一个其它字符,如空格。
二、BJ混排,利用js+正则,对于/,,/g进行循环替换,直到/,,/g.test(str)为false为止。然后在输出时将替换后的字符置空,这个比第一种方案要麻烦点,但灵活性较大些。
作者: CrLf    时间: 2015-1-21 15:16

没有太好的办法,把它转成标准 csv 吧:
  1. @echo off
  2. for /f "skip=1 delims=" %%a in (1.txt) do (
  3. set "str=%%a"
  4. setlocal enabledelayedexpansion
  5. set str="!str:"=""!"
  6. set "setlocal=true"
  7. for /f "tokens=1-11 delims=," %%a in ("!str:,="^,"!") do (
  8. endlocal
  9. set "setlocal="
  10. echo,姓名 : %%~a
  11. echo,性别 : %%~b
  12. echo,语文 : %%~c
  13. echo,数学 : %%~d
  14. echo,英语 : %%~e
  15. echo,化学 : %%~f
  16. echo,物理 : %%~g
  17. echo,地理 : %%~h
  18. echo,历史 : %%~i
  19. echo,政治 : %%~j
  20. echo,总分 : %%~k
  21. )
  22. if defined setlocal endlocal
  23. )
  24. pause&goto :eof
复制代码

作者: amwfjhh    时间: 2015-1-21 15:26

本帖最后由 amwfjhh 于 2015-1-21 15:28 编辑


作者: c755731262    时间: 2015-1-23 10:45

回复 3# CrLf


    有点奇怪第5行代码变量里面没有引号怎么还替换
作者: CrLf    时间: 2015-1-23 15:54

回复 5# c755731262


    以防万一,避免原文中的 " 和用 , 替换的 "," 混淆,不过这里是多虑了的,人名和分数都不可能出现双引号
作者: yiwuyun    时间: 2015-1-24 20:49

  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for /f "delims=" %%a in (1.txt) do (
  4.   set "str=%%a"
  5.   set str="!str:,="^,"!"
  6.   for /f "tokens=1-11 delims=," %%a in ('echo !str!') do (
  7.       echo,姓名 : %%~a
  8.       echo,性别 : %%~b
  9.       echo,语文 : %%~c
  10.       echo,数学 : %%~d
  11.       echo,英语 : %%~e
  12.       echo,化学 : %%~f
  13.       echo,物理 : %%~g
  14.       echo,地理 : %%~h
  15.       echo,历史 : %%~i
  16.       echo,政治 : %%~j
  17.       echo,总分 : %%~k
  18.   )
  19. )
  20. pause
复制代码
也可用不带/f 的for语句。也可写一个逗号切分的函数来实现。




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