如何只读取文本文件中单一的指定行?
问:
嗨,Scripting Guy!如何只读取文本文件中指定的一行? 例如,如何编写一个这样的脚本:只读取一个文本文件中的第 16 行,然后将该行的值存储在一个变量中?

-- DL

答:
您好,DL。您知道,我们有一段时间没有回答有关文本文件的问题了,这不是值得夸耀的事,毕竟有时似乎我们收到的所有其他问题都与读取和写入文本文件有关。人们总是问我们是否曾经遇见过 Bill Gates,其实我们总是避免遇见 Bill Gates,因为我们怕他问我们有关文本文件的问题。

当然,我们之所以收到如此多有关文本文件的问题,其原因是内置到 Windows 的脚本编写技术不具备非常复杂的文本处理能力。以这个问题为例。您可能会想 WSH 或 VBScript 或“某些”脚本对象应该有一个方法,对这种方法您可以说,“嗨,去读取第 16 行并且只读取该文件的第 16 行”。”没这么简单。FileSystemObject 提供脚本程序可用的大多数文本处理能力,它只能从文件的第 1 行开始,然后向下处理。没有能快速跳到指定行的方法。

尽管如此,这并不意味着我们不能只将第 16 行的值存储在一个变量里,它只意味着我们必须使用一种不太“优雅的”的方法。为简便起见,让我们考虑一个有 5 行的简单文本文件:

1 2 3 This is line no. 4 in the text file.5
我们想将第 4 行的内容(只是第 4 行的内容)存储在一个变量中。我们不能直接跳到第 4 行,但我们可以使用如下脚本得到所需结果:

Const ForReading = 1

Set objFSO = CreateObject("Scripting.FileSystemObject") Set objTextFile = objFSO.OpenTextFile("mylogfile.log", ForReading)

For i = 1 to 3 objTextFile.ReadLine Next

strLine = objTextFile.ReadLine Wscript.Echo strLine

objTextFile.Close
那么,这里做了些什么呢?好,刚开始我们创建了一个 FileSystemObject 的实例并打开文件 Mylogfile.log 以供读取。然后我们创建了一个 For Next 循环,从 1 循环到 3。在循环内部,我们使用了 ReadLine 方法读取文本文件中的当前行。

为什么?好,记住,我们真正关心的是第 4 行,但 FileSystemObject 不允许我们直接到达第 4 行,我们只能先通过第 1 、2 和 3 行。这就是该代码块实际进行的工作。第一次执行循环时,它调用 ReadLine 方法,这个操作读取文本文件的第 1 行(尽管我们不对读取的信息作任何处理),然后自动移动到文件的下一行(第 2 行)。第二次执行循环时,我们读取第 2 行,然后移动到第 3 行。第三次执行循环时,对,我们读取第 3 行,然后移动到第 4 行,即我们感兴趣的行。

此时,我们的循环结束。我们再次调用 ReadLine 方法,只有这一次我们将该行的内容存储在变量 strLine 中。这是我们所做的工作:

strLine = objTextFile.ReadLine
由于是演示脚本,我们接着就回显了 strLine 的值并关闭了该文本文件。我们无法使用任何巧妙的捷径,但是我们达到了目的:设法将第 4 行的值放入变量 strLine 中。

正如我们说的,不是很优雅,但可行。而且它运行得相当快。例如,创建一个 10,000 行的示例日志文件,修改脚本以使其仅将第 9999 行的值存储到一个变量中。(您会怎么做呢?更改 For Next 循环,以从 1 循环到 9998。)然后回显第 9999 行的值。如果这样做,就会看到“优雅”之处:整个过程只使用一秒钟左右。情人眼里出西施,我们发现,任何只需花一两秒钟就能完成的脚本实在是很“美丽”的。