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

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

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

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

评分人数

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

厉害了 谢谢分享

TOP

17# caruko
这个问题我倒是没有,shift /n 用着没问题。

TOP

10# mxxcgzxxx


谢谢哈 您的方法正好解决了我的问题,也谢谢其他帮我解决问题的前辈

TOP

shift 说明是 启用扩展可以 shift /n 移动0-9位。
但是我测试了很久都有问题,只有shift,默认方式不会出错。

TOP

12# caruko
shift不带参数默认从0还是1移动?

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

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

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

本帖最后由 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

***共同提高***

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

本帖最后由 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

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

TOP

5# tmplinshi

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

TOP

返回列表