Board logo

标题: [资料]如何提取不同行上的内容 [打印本页]

作者: bagpipe     时间: 2006-7-3 10:21    标题: [资料]如何提取不同行上的内容

中文翻译见18楼(版务 by HAT @ 2009-01-04)

原在#27,修正至#18 (管理员注 2009-1-5)


  Quote:
This page shows how to read specific lines from a text file. There are many ways to have the for /f command read the input file, for instance:-

for /f "delims=" %%a in (input.txt) do ...

for /f "delims=" %%a in ('type input.txt') do ...

for /f "delims=" %%a in ('more ^< input.txt') do ...

However, only the last method (using the more command) will give consistent results across Windows NT, 2000, XP and 2003. The first method does not recognise unicode files. Also, the usebackq switch must be used if the input filename contains spaces. The second method, using the type command, also fails to recognise unicode files on Windows 2000, XP and 2003 if the input file does not begin with a bit order mark (BOM).

In all the examples, assume the contents of of the file numbers.txt to be:-

one
two
three
four
five
six
seven
eight
nine
ten

Displaying the first line

This example prints one.

@echo off & setlocal ENABLEEXTENSIONS
set "first="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  if not defined first set first=%%a
)
echo/%first%

Displaying the first X lines

This example prints one, two and three.

@echo off & setlocal ENABLEEXTENSIONS
set "lines=3"
set i=-1
set "ok="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)

Displaying the last line

This example prints ten.

@echo off & setlocal ENABLEEXTENSIONS
for /f "delims=" %%a in ('more ^< numbers.txt') do set "last=%%a"
echo/%last%

Displaying the last X lines

This example prints nine and ten.

@echo off & setlocal ENABLEEXTENSIONS
set "lines=2"
for /f %%a in ('find/c /v "" ^< numbers.txt') do set/a skip=%%a-lines
for /f "delims=" %%a in ('more/e +%skip% ^< numbers.txt') do (
  echo/%%a
)

Displaying the Nth line

This example prints three. Note that instead of using the more command's /e switch, the skip option could have been used with the for /f command, however, this fails is it is set to any number less than one.

@echo off & setlocal ENABLEEXTENSIONS
set LineNo=3
set "line="
set/a LineNo-=1
for /f "delims=" %%a in ('more/e +%LineNo% ^< numbers.txt') do (
  if not defined line set "line=%%a"
)
echo/%line%

Displaying the Nth line plus X number of lines

This example prints five and six.

@echo off & setlocal ENABLEEXTENSIONS
set start=5
set "lines=2"
set/a i=-1,start-=1
set "ok="
for /f "delims=" %%a in ('more/e +%start% ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)


作者: tclshx     时间: 2006-7-5 23:37


  Quote:
Originally posted by bagpipe at 2006-7-3 10:21 AM:
This page shows how to read specific lines from a text file. There are many ways to have the for /f command read the input file, for instance:-

for /f "delims=" %%a in (input.txt) do . ...

对一我们新鸟来说太难,要是有中文说明就好了.
作者: hanbsome     时间: 2006-7-6 16:07
的确就像二楼说的那样  太深奥了 看不懂啊
作者: pengfei     时间: 2006-7-26 22:21
楼主能不能具体解释一下.
作者: voiL     时间: 2006-7-27 00:10
没有中文的说明,只能看懂一部分.
作者: IceCrack     时间: 2006-7-27 00:52
英文单词不是太多啊.不认识的可以用百度词典查一下的.而且批处理不会的话.应该把哪个不会说出来.这样也好解释.如果你全篇看不懂的话.那么你不适合看这篇文章.可以看一下我签名中的这个电子书.应该对你有帮助的
作者: qwr123     时间: 2006-7-27 11:50
太深奥了 看不懂啊
作者: Climbing     时间: 2006-7-27 14:50
很不错,以前还真没有注意到more命令有那么多的参数。
作者: namejm     时间: 2006-7-27 18:51
  more的用法真是强。以后要显示指定行的内容就有模式可套用了,呵呵,不错不错。
作者: hxuan999     时间: 2006-11-23 03:33
有点乱
作者: redtek     时间: 2006-11-25 03:19


  Quote:
Originally posted by namejm at 2006-7-27 05:51:
  more的用法真是强。以后要显示指定行的内容就有模式可套用了,呵呵,不错不错。

同感,无限佩服~:)
好玩的贴子不能沉下去~:)
作者: foxfast     时间: 2007-1-15 03:51
真的很晕,签名里从÷的路径是错了的啊
作者: xiaohacker     时间: 2007-1-15 05:30    标题: 佩服的五体投地

强人,我佩服的五体投地,但是没有中文说明,我是看的一塌糊涂!唉,请高手们指点一下我等菜们应该看一些什么样的dos技术书!
作者: ccwan     时间: 2007-1-15 06:30
灌水

[ Last edited by ccwan on 2007-1-20 at 09:24 PM ]
作者: 40szb     时间: 2007-1-21 09:55
说明一下
作者: happy3     时间: 2007-1-24 06:35
太深奥了, 看不懂啊!
作者: ccwan     时间: 2007-1-24 06:46
我再来灌一水,我在14楼曾经贴过译文,但是之后的几楼再次提出看不懂,考虑到我拙劣的英文水平可能造成误解,就删除了,今天再次张贴,请高手指正。
作者: ccwan     时间: 2007-1-24 06:46
难道懂E文的朋友都没看到?
看来只好用我拙劣的水平试试看,希望能抛砖引玉。
请大家批评指正但不要笑话,我脸皮很薄的。^_^
CODE:  [Copy to clipboard]
这一页告诉大家如何从一个文本文件读取某一行. 这里有很多方法可以使用 for/f 读取 input.txt 的内容,例如:

for /f "delims=" %%a in (input.txt) do ...

for /f "delims=" %%a in ('type input.txt') do ...

for /f "delims=" %%a in ('more ^< input.txt') do ...

不过,只有最后一种方法(使用 more 命令) 可以在不同的操作系统中如:Windows NT, 2000, XP and 2003 取得一致的结果。第一种方法不能识别UNICODE编码文件,并且, 如果输入文件名包含空格,usebackq 参数必须被使用,第二个方法, 使用 type 命令, 在 windows2000, XP 和 2003 中如果文件不是从字节序标记(BOM)开始 ,同样不识别unicode 文件。

在所有例子中,假设numbers.txt的内容为:

one
two
three
four
five
six
seven
eight
nine
ten

显示第一行

这个例子输出 one。

@echo off & setlocal ENABLEEXTENSIONS
set "first="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  if not defined first set first=%%a
)
echo/%first%

显示前几行

这个例子输出 one, two 和 three。

@echo off & setlocal ENABLEEXTENSIONS
set "lines=3"
set i=-1
set "ok="
for /f "delims=" %%a in ('more ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)

显示最后一行

这个例子输出 ten。

@echo off & setlocal ENABLEEXTENSIONS
for /f "delims=" %%a in ('more ^< numbers.txt') do set "last=%%a"
echo/%last%

显示最后几行

这个例子输出 nine 和 ten。

@echo off & setlocal ENABLEEXTENSIONS
set "lines=2"
for /f %%a in ('find/c /v "" ^< numbers.txt') do set/a skip=%%a-lines
for /f "delims=" %%a in ('more/e +%skip% ^< numbers.txt') do (
  echo/%%a
)

显示第 n 行

这个例子输出three,注意这里使用more的 /e 参数 来跳过指定的行数,配合for/f 使用,当数值小于1时会失败。


@echo off & setlocal ENABLEEXTENSIONS
set LineNo=3
set "line="
set/a LineNo-=1
for /f "delims=" %%a in ('more/e +%LineNo% ^< numbers.txt') do (
  if not defined line set "line=%%a"
)
echo/%line%

显示第 n 行加上 X 行

这个例子输出five和six。

@echo off & setlocal ENABLEEXTENSIONS
set start=5
set "lines=2"
set/a i=-1,start-=1
set "ok="
for /f "delims=" %%a in ('more/e +%start% ^< numbers.txt') do (
  set/a i+=1 & for /f %%z in ('echo/%%i%%') do (
    if "%%z"=="%lines%" set ok=1
  )
  if not defined ok echo/%%a
)

作者: enliang     时间: 2007-3-21 23:11
遇到类似这样的行就没效了??

<td width=45 align=center rowspan=2>3</td>
<td width=83 align=center rowspan=2>02.I</td> <!-- @T -->
作者: knoppix7     时间: 2007-7-29 09:20
这下可以用bat搞rss了。




欢迎光临 中国DOS联盟论坛 (http://cndos.fam.cx/forum/) Powered by Discuz! 2.5