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

[文本处理] 增强FOR语句的tokens-delims组合

[复制链接]
发表于 2015-1-21 14:53:06 | 显示全部楼层 |阅读模式
本帖最后由 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
复制代码
则历史,政治,总分所对应的数字则会被前移到化学,物理,地理三者的变量下,这显然不是我们希望的,请问各位这种情况在批处理你们又是如何处理的呢?
 楼主| 发表于 2015-1-21 15:11:17 | 显示全部楼层
抛砖引玉一下:
一、详细分割前先用set替换在,前插入一个其它字符,如空格。
二、BJ混排,利用js+正则,对于/,,/g进行循环替换,直到/,,/g.test(str)为false为止。然后在输出时将替换后的字符置空,这个比第一种方案要麻烦点,但灵活性较大些。
发表于 2015-1-21 15:16:49 | 显示全部楼层
没有太好的办法,把它转成标准 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技术 +1 收起 理由
amwfjhh + 1 变量延时功底非凡

查看全部评分

 楼主| 发表于 2015-1-21 15:26:50 | 显示全部楼层
本帖最后由 amwfjhh 于 2015-1-21 15:28 编辑

发表于 2015-1-23 10:45:46 | 显示全部楼层
回复 3# CrLf


    有点奇怪第5行代码变量里面没有引号怎么还替换
发表于 2015-1-23 15:54:27 | 显示全部楼层
回复 5# c755731262


    以防万一,避免原文中的 " 和用 , 替换的 "," 混淆,不过这里是多虑了的,人名和分数都不可能出现双引号
发表于 2015-1-24 20:49:04 | 显示全部楼层

  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语句。也可写一个逗号切分的函数来实现。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-19 19:10 , Processed in 0.063925 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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