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

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

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

最近在学习for命令.我想请教下各位前辈:for命令中怎样用tokens取到最后一列(在列数未知的条件下) ,谢谢哈
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

好问题,方法很多,但简洁高效的,有待研究。。顶起。

TOP

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

TOP

参考:批处理实现文本最末列数值乘一个数
http://bbs.bathome.net/thread-1367-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

本帖最后由 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
复制代码
注:如果字符串中含有 \ 和 /,需要先替换掉,取得文件名后再还原。
2

评分人数

TOP

3# playinthesky


你可以试试超过32列之后是否依然好判断
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

5# tmplinshi

LZ这个问题很有意义,tmplinshi的回答很巧妙!~顶起,继续观察。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

可以把分隔符替换成换行符,然后很简单了

TOP

本帖最后由 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的值只能是已知的数字,而变量的位置又不可知,结果是无法处理。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

默认分隔符情况下
  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
复制代码
1

评分人数

世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

***共同提高***

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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
复制代码

TOP

12# caruko
楼主说是未知文本,也就意味着列数不确定,有可能非常多列也可能非常少列
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

将分隔符替换成换行符:
  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
复制代码

TOP

返回列表