[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] 增强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
复制代码
则历史,政治,总分所对应的数字则会被前移到化学,物理,地理三者的变量下,这显然不是我们希望的,请问各位这种情况在批处理你们又是如何处理的呢?

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

TOP

没有太好的办法,把它转成标准 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
复制代码
1

评分人数

    • amwfjhh: 变量延时功底非凡技术 + 1

TOP

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

TOP

回复 3# CrLf


    有点奇怪第5行代码变量里面没有引号怎么还替换

TOP

回复 5# c755731262


    以防万一,避免原文中的 " 和用 , 替换的 "," 混淆,不过这里是多虑了的,人名和分数都不可能出现双引号

TOP

  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语句。也可写一个逗号切分的函数来实现。

TOP

返回列表