Board logo

标题: [文本处理] [已处理]批处理for循环中tokens怎样获取指定列? [打印本页]

作者: missll    时间: 2011-4-27 00:24     标题: [已处理]批处理for循环中tokens怎样获取指定列?

本帖最后由 missll 于 2011-4-27 16:20 编辑

111.txt

[192.168.0.111 ]:    Domin 1.1
___________________________________
  1. @echo off
  2. for /f  "tokens=1-4 delims=[ " %%a in (111.txt) do (
  3. if /i "%%d"=="1.1" echo %%a %%d )
复制代码
以上命令可以正常的输出192.168.0.111  1.1
但是如果我把1-4写成1,4的时候则输出的错误的

例如:
  1. @echo off
  2. for /f  "tokens=1,4 delims=[ " %%a in (111.txt) do (
  3. if /i "%%d"=="1.1" echo %%a %%d )
复制代码
我只想取1和4节点的值,为什么1-4正确 1,4就输出错误呢?

=============================================

另外我想知道 在 in (xxx.txt) 中,很多人写成 in ('type xxx.txt') 为什么用type读它呢?
当然我知道dir 的参数是可以控制输出的信息.  但是 使用/不使用 type  区别在哪里呢?
作者: batman    时间: 2011-4-27 00:39

因为此时文本中分隔出的四列是输出时的第二列
  1. @echo off
  2. for /f  "tokens=1,4 delims=[ " %%a in (111.txt) do (
  3. if /i "%%d"=="1.1" echo %%a %%b )
复制代码

作者: batman    时间: 2011-4-27 00:43

type xxxx.txt这样的形式一般是多此一举而且降低效率,但是要改写原文本而不生成临时文件时,就要用到type了。

dir只能输出文本信息不能输出文本内容,而type只能输出文本内容不能输出文本信息。
作者: CrLf    时间: 2011-4-27 00:47

本帖最后由 zm900612 于 2011-4-27 00:53 编辑

for无法直接读取Unicode文本,所以有时需要通过type转换,除了少数情况,大部分时候在for中用type都是在画蛇添足
作者: Batcher    时间: 2011-4-27 01:04

4# zm900612


你可以试着写几个统计文件行数的for代码,看看type到底是提高了效率还是降低了效率。
作者: wc726842270    时间: 2011-4-27 11:36

恩,有些时候也不了解为什么会要用TYPE打开,不过倒是看见不少人这么写。在CSDN有时也能见到,不过要想真正了解的话可能涉汲一些原理了。
作者: CrLf    时间: 2011-4-27 13:10

4# zm900612


你可以试着写几个统计文件行数的for代码,看看type到底是提高了效率还是降低了效率。
Batcher 发表于 2011-4-27 01:04
  1. @echo off
  2. set /a n=0,m=0
  3. echo %time%
  4. for /f %%a in (y1.txt) do set /a n+=1
  5. echo %n%
  6. echo %time%
  7. for /f %%a in ('type y1.txt') do set /a m+=1
  8. echo %m%
  9. echo %time%
  10. pause
复制代码
耗时:
13:03:39.39
1000005
13:04:36.30
...
第二个测试等了六分多钟没见到结果,就cut了...但是单纯用for的1分钟和在for中用type的至少6分钟的耗时相比,明显是从文件读取有优势
作者: Hello123World    时间: 2011-4-27 13:28

1# missll
第二个代码改成这样既可
  1. @echo off
  2. for /f  "tokens=1,4 delims=[ " %%a in (111.txt) do (
  3. if /i "%%b"=="1.1" echo %%a %%b )
  4. pause
复制代码
参数的提取是按顺序来的,1,4其实就是两个参数,应该是 a b ,而不是 abcd——ad

用type 和直接用文本的路径没有什么大区别,就是在语法上需要注意,都是抓耗子的猫。
作者: applba    时间: 2011-4-27 13:39

楼上和我想的一样……
从来没有想过要用type
作者: hanyeguxing    时间: 2011-4-27 14:22

1,tokens=1-4就相当于tokens=1,2,3,4
假如变量从%%a开始,那么将2列传递给%%b,第3列传递给%%c ...... for 只传递 tokens= 指定的列
2,一般使用 type 为以下几个目的
直接查看文件
文本编码转为 ANSI 并保留空行
等等
3,你看到有人这样写,通常是因为为了使此批处理兼容更多的编码类型
作者: missll    时间: 2011-4-27 16:22

谢谢各位积极的回复

是我太粗心了,我知道1-4是取 1,2,3,4    1,4是取  1和4
所以我在写1,4的时候  4还是用了%%d ,应该是写%%b 才对.
作者: Batcher    时间: 2011-4-27 16:25

7# zm900612


找个10万行以上的文件试试这两个:
  1. @echo off
  2. for /f %%a in ('type a.txt^|find /c /v ""') do (
  3.     set "RowNum=%%a"
  4. )
  5. echo,%RowNum%
复制代码
  1. @echo off
  2. for /f %%a in (a.txt) do (
  3.     set /a RowNum+=1
  4. )
  5. echo,%RowNum%
复制代码

作者: CrLf    时间: 2011-4-27 17:06

12# Batcher


我是拿随风版主的那道“超大文本去除重复行”里面的测试文件做的测试,文件将近四十兆,1000005行
作者: Batcher    时间: 2011-4-28 01:19

13# zm900612


12楼的两个代码分别耗时多少?




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