Board logo

标题: [文本处理] [已解决]批处理for命令怎样用tokens取到最后的一列? [打印本页]

作者: isolet    时间: 2011-6-25 23:01     标题: [已解决]批处理for命令怎样用tokens取到最后的一列?

本帖最后由 isolet 于 2011-6-26 13:33 编辑

最近在学习for命令.我想请教下各位前辈:for命令中怎样用tokens取到最后一列(在列数未知的条件下) ,谢谢哈
作者: plp626    时间: 2011-6-25 23:04

好问题,方法很多,但简洁高效的,有待研究。。顶起。
作者: playinthesky    时间: 2011-6-25 23:20

我在学习中也碰见,你选的分隔符可以定义成字符或者字母或者单词。然后定义成特殊字符,让批处理认为是分隔符,那最后一个节应该好判断了吧。
作者: Batcher    时间: 2011-6-25 23:24

参考:批处理实现文本最末列数值乘一个数
http://bbs.bathome.net/thread-1367-1-1.html
作者: tmplinshi    时间: 2011-6-25 23:26

本帖最后由 tmplinshi 于 2011-7-23 13:24 编辑

把字符串变成路径,然后文件名就是最后一列。
  1. @echo off
  2. set str=1 2 3 4 5 6 7 8
  3. set str=%str: =\%
  4. for /f "tokens=*" %%i in ("%str%.$") do echo %%~ni
  5. pause
复制代码
注:如果字符串中含有 \ 和 /,需要先替换掉,取得文件名后再还原。
作者: Batcher    时间: 2011-6-25 23:28

3# playinthesky


你可以试试超过32列之后是否依然好判断
作者: cjiabing    时间: 2011-6-25 23:44

5# tmplinshi

LZ这个问题很有意义,tmplinshi的回答很巧妙!~顶起,继续观察。
作者: CrLf    时间: 2011-6-26 00:06

可以把分隔符替换成换行符,然后很简单了
作者: cjiabing    时间: 2011-6-26 00:11

本帖最后由 cjiabing 于 2011-6-26 00:19 编辑

8# zm900612
我在处理这些问题的时候,都不敢用横排的,一般都是用竖排的,遇到未知的行时,用findsrt /n来定位行,或者添加set /a num+=1来计算。
因为在处理横排(如%%a %%b %%c)的时候,最后面的变量往往为空,或者不确定,而且定位起来比较麻烦,比如,我只要最后一个变量,而对前面的变量忽略不计,这样,问题就出来了。
主要是懒,不想去解决,看看大家有好的想法学习下。
举例:提取“123  哈哈 789  A”中的“a”
通常是这样的:
for /f "tokens=4" %%a in (%var%) do echo %%a
但假如字符串的列是不规则的,有可能是4列,有可能是3列、5列、1列、10列……
此时用以上就有点难度了。
for %%a in (%var%) do set str=%%a
echo %str%
这样还好,不管怎么样,它只能提取最后一行(一列)。
假如提取倒数第二列呢?
使用不带参数的for,配合set /a num+=1计算,也能算得出倒数第二个变量。但for /f "tokens"就无能为力了,因为tokens的值只能是已知的数字,而变量的位置又不可知,结果是无法处理。
作者: mxxcgzxxx    时间: 2011-6-26 00:18

默认分隔符情况下
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "tokens=*" %%1 in (1.txt) do (
  4.           for %%j in (%%1) do set a=%%j
  5.           echo !a!
  6.           )
  7. pause>nul
复制代码

作者: batman    时间: 2011-6-26 01:19

楼主可参考此贴:

http://www.bathome.net/viewthrea ... 6%C0%ED%B3%AC%D4%BD
作者: caruko    时间: 2011-6-26 09:47

本帖最后由 caruko 于 2011-6-26 09:51 编辑

如果是取任意指定列,感觉还是 shift 要方便一些。
  1. rem 取第三列
  2. call :cut 3 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
  3. goto :eof
  4. :cut [ofset] [string]
  5. for /l %%i in (1,1,%1) do shift
  6. echo,%1
复制代码

作者: CrLf    时间: 2011-6-26 10:00

本帖最后由 zm900612 于 2011-6-26 10:31 编辑

9# cjiabing

用一个临时变量可以提取倒数第一列,那么用两个变量就可以提取倒数第二个...
或者在一个临时变量中以一个不属于原有字符串的字符作为分隔符来存储多个变量:
set str=123  哈哈 789  A
for %%a in (%str%) do (
   set "tmp=!tmp:*|=!%%a|"
)
for /f "delims=|" %%a in ("%tmp%") do echo %%a



不含特殊字符时可以:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123  哈哈 789  A
  3. set "tmp=1|2|"
  4. for %%a in (%str%) do set "tmp=!tmp:*|=!%%a|"
  5. ::将多个变量存储在一个变量中
  6. for /f "delims=|" %%a in ("%tmp%") do echo %%a
  7. pause
复制代码


没有重复列时可以:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123  哈哈 789  A
  3. set str$=%str%$
  4. for %%a in (%str%) do set "end=%%a$"
  5. for %%a in (!str$: %end%^=!) do set end=%%a
  6. ::替换最后一列
  7. echo %end%
  8. pause
复制代码

作者: mxxcgzxxx    时间: 2011-6-26 10:10

12# caruko
楼主说是未知文本,也就意味着列数不确定,有可能非常多列也可能非常少列
作者: CrLf    时间: 2011-6-26 10:12

将分隔符替换成换行符:
  1. @echo off&setlocal enabledelayedexpansion
  2. set str=123  哈哈? *.* 789  A”中的a
  3. set hh=^
  4. for %%a in ("!hh!") do (
  5.    for /f "delims=" %%b in ("!str: =%%~a!") do set end=%%b
  6. )
  7. echo %end%
  8. pause
复制代码

作者: Hello123World    时间: 2011-6-26 16:00

12# caruko
shift不带参数默认从0还是1移动?
作者: caruko    时间: 2011-6-26 17:45

shift 说明是 启用扩展可以 shift /n 移动0-9位。
但是我测试了很久都有问题,只有shift,默认方式不会出错。
作者: isolet    时间: 2011-6-26 18:43

10# mxxcgzxxx


谢谢哈 您的方法正好解决了我的问题,也谢谢其他帮我解决问题的前辈
作者: Hello123World    时间: 2011-6-26 21:12

17# caruko
这个问题我倒是没有,shift /n 用着没问题。
作者: a5321    时间: 2020-12-23 11:32

厉害了 谢谢分享




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