Board logo

标题: [文本处理] for命令的delims和tokens怎么搭配使用分割字段 [打印本页]

作者: lyonamstrong    时间: 2016-8-28 22:51     标题: for命令的delims和tokens怎么搭配使用分割字段

本帖最后由 pcl_test 于 2016-8-29 17:12 编辑

for /f delims tokens的问题
如果每行的文本有多个相同的分隔符怎么办?
比如
4、情歌-经典-黄灿-黄玫瑰.mp3
里面有3个-做分隔符,但是我想截取黄灿-黄玫瑰.mp3
那delims=-是不是没用?比如要delims=- - -,然后借用tokens=34才行?
或者有其它方法请明示。
作者: 诗歌王位    时间: 2016-8-28 23:08

  1. @echo off && setlocal enabledelayedexpansion
  2. if exist 2.txt (del /f /q 2.txt)
  3. for /f "delims=" %%i in (1.txt) do (
  4. set "var=%%i"
  5. for /f "tokens=3,4 delims=-" %%a in ("!var!") do (
  6. echo %%a-%%b>>2.txt
  7. )
  8. )
复制代码
【代码分析】
1.对tokens=3,4
作者: GNU    时间: 2016-8-28 23:20

回复 2# 诗歌王位
  1. @echo off
  2. for /f "tokens=2,* delims=-" %%i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (
  3.     echo,%%j
  4. )
  5. pause
复制代码
2,* 比 3,4 更加灵活
作者: lyonamstrong    时间: 2016-8-28 23:28

本帖最后由 lyonamstrong 于 2016-8-28 23:30 编辑

试了下,如果把一行文本分隔成3块,要显示任意两块,23或者2,3或者2,*都不行。难道是我的姿势不对……
但是单独显示2或者3是可以的,所以分隔是没问题
作者: 诗歌王位    时间: 2016-8-29 07:35

这个时候,你该亮剑了,亮出你的代码啊。。。。。。同意3楼观点
[代码分析]
1.那个文本还是单个字段处理你都没有明确,注意下2楼的字段,即源文件都是放在1.txt的
作者: happy886rr    时间: 2016-8-29 08:30

本帖最后由 happy886rr 于 2016-8-29 08:37 编辑

回复 5# 诗歌王位 一行流
  1. @echo off&(for /f "delims=" %%A in ('type 1.txt') do (for /f "tokens=2* delims=-" %%a in ("%%A") do (echo %%b)))>2.txt
复制代码

作者: GNU    时间: 2016-8-29 09:34

回复 4# lyonamstrong


你要显示哪两块?把测试用例和测试结果分别发出来看看。
作者: lyonamstrong    时间: 2016-8-29 10:01

就是3楼的那条代码
for /f "tokens=2,* delims=-" %%i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %%i)
我直接在cmd中打,所以是
for /f "tokens=2,* delims=-" %i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %i)
并不能显示 经典-黄灿-黄玫瑰.mp3
显示的是 经典
也就是说 ,*不起作用
作者: flyinnet9    时间: 2016-8-29 10:06

for /f "tokens=2,* delims=-" %i in ("情歌-经典-黄灿-黄玫瑰.mp3") do (echo %j)
作者: GNU    时间: 2016-8-29 10:12

回复 8# lyonamstrong


    请仔细观察3楼代码,设置循环变量的时候从%%i开始,但是使用的时候是%%j
作者: lyonamstrong    时间: 2016-8-29 10:19

本帖最后由 lyonamstrong 于 2016-8-29 14:01 编辑

还想问问清楚

单个部分显示的实现了:
for /f "delims=、,-,. tokens=3" %a in (110.txt) do echo %a

单个部分一直到结尾显示也实现了:
for /f "delims=、,-,. tokens=2*" %a in (110.txt) do echo %a%b

但是显示当中几项的却存疑:
for /f "delims=、,-,. tokens=23" %a in (110.txt) do echo %a%b 这样无法实现
for /f "delims=、,-,. tokens=2,3" %a in (110.txt) do echo %a,%b 这样实现了,但是间隔号不是原来的“-”而是改成了“,”
我想请问有什么办法直接保留原来的间隔符号不变?

还有如果是5部分,那tokens=1245如何实现?我试过了,12或45都无法实现。
作者: lyonamstrong    时间: 2016-8-29 15:20

please
问完这个我就不问了
作者: happy886rr    时间: 2016-8-29 15:39

回复 12# lyonamstrong
请认真查看for的基础教程
就没有tokens=1245这种写法,都是写为tokens=1,2,4,5
作者: lyonamstrong    时间: 2016-8-29 17:48

回复 13# happy886rr


    阿里嘎多!
作者: GNU    时间: 2016-8-29 19:18

回复 11# lyonamstrong


    建议把tokens放前面delims放后面




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