标题: [文本处理] [已处理]批处理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
___________________________________- @echo off
- for /f "tokens=1-4 delims=[ " %%a in (111.txt) do (
- if /i "%%d"=="1.1" echo %%a %%d )
复制代码
以上命令可以正常的输出192.168.0.111 1.1
但是如果我把1-4写成1,4的时候则输出的错误的
例如:- @echo off
- for /f "tokens=1,4 delims=[ " %%a in (111.txt) do (
- 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
因为此时文本中分隔出的四列是输出时的第二列- @echo off
- for /f "tokens=1,4 delims=[ " %%a in (111.txt) do (
- 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
- @echo off
- set /a n=0,m=0
- echo %time%
- for /f %%a in (y1.txt) do set /a n+=1
- echo %n%
- echo %time%
- for /f %%a in ('type y1.txt') do set /a m+=1
- echo %m%
- echo %time%
- pause
复制代码
耗时:
13:03:39.39
1000005
13:04:36.30
...
第二个测试等了六分多钟没见到结果,就cut了...但是单纯用for的1分钟和在for中用type的至少6分钟的耗时相比,明显是从文件读取有优势
作者: Hello123World 时间: 2011-4-27 13:28
1# missll
第二个代码改成这样既可- @echo off
- for /f "tokens=1,4 delims=[ " %%a in (111.txt) do (
- if /i "%%b"=="1.1" echo %%a %%b )
-
- 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万行以上的文件试试这两个:- @echo off
- for /f %%a in ('type a.txt^|find /c /v ""') do (
- set "RowNum=%%a"
- )
- echo,%RowNum%
复制代码
- @echo off
- for /f %%a in (a.txt) do (
- set /a RowNum+=1
- )
- echo,%RowNum%
复制代码
作者: CrLf 时间: 2011-4-27 17:06
12# Batcher
我是拿随风版主的那道“超大文本去除重复行”里面的测试文件做的测试,文件将近四十兆,1000005行
作者: Batcher 时间: 2011-4-28 01:19
13# zm900612
12楼的两个代码分别耗时多少?
欢迎光临 批处理之家 (http://bbs.bathome.net/) |
Powered by Discuz! 7.2 |