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

[文本处理] [已处理]批处理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  区别在哪里呢?
1

评分人数

    • batman: 感谢给帖子标题标注[已解决]字样PB + 2
花开不问月,不语笑红尘.

13# zm900612


12楼的两个代码分别耗时多少?
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

12# Batcher


我是拿随风版主的那道“超大文本去除重复行”里面的测试文件做的测试,文件将近四十兆,1000005行

TOP

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%
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

谢谢各位积极的回复

是我太粗心了,我知道1-4是取 1,2,3,4    1,4是取  1和4
所以我在写1,4的时候  4还是用了%%d ,应该是写%%b 才对.
花开不问月,不语笑红尘.

TOP

1,tokens=1-4就相当于tokens=1,2,3,4
假如变量从%%a开始,那么将2列传递给%%b,第3列传递给%%c ...... for 只传递 tokens= 指定的列
2,一般使用 type 为以下几个目的
直接查看文件
文本编码转为 ANSI 并保留空行
等等
3,你看到有人这样写,通常是因为为了使此批处理兼容更多的编码类型
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

楼上和我想的一样……
从来没有想过要用type

TOP

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 和直接用文本的路径没有什么大区别,就是在语法上需要注意,都是抓耗子的猫。

TOP

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分钟的耗时相比,明显是从文件读取有优势

TOP

恩,有些时候也不了解为什么会要用TYPE打开,不过倒是看见不少人这么写。在CSDN有时也能见到,不过要想真正了解的话可能涉汲一些原理了。
枫中残雪:风停了,我的心却在动,让我心中的寒意走向远方

TOP

4# zm900612


你可以试着写几个统计文件行数的for代码,看看type到底是提高了效率还是降低了效率。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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

for无法直接读取Unicode文本,所以有时需要通过type转换,除了少数情况,大部分时候在for中用type都是在画蛇添足

TOP

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

dir只能输出文本信息不能输出文本内容,而type只能输出文本内容不能输出文本信息。
***共同提高***

TOP

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

TOP

返回列表