如何从文本文件中删除所有空白行?

来源:百度文库 编辑:神马文学网 时间:2024/04/29 02:35:22
问:
您好,脚本专家!如何从文本文件中删除所有空白行?
-- RE
答:
您好,RE。您知道,早在 2002 年,当时的脚本专家们还只是一些默默无闻之辈时,我们就开始编写Microsoft Windows 2000 Scripting Guide(英文)了。在整理该书时,我们遇到了来自某些人的巨大阻力,这些人认为即使是提到文本文件也是一个错误。为什么会是这样?因为没有人还在使用文本文件,我们在一项过时的技术上浪费时间是有点傻。
注意:无论您是否相信,即便该书旨在向人们讲授如何使用 VBScript 编写脚本,可是在将 VBScript 一章加入该书时我们还是遇到了相当大的阻力。但这是另外一回事。
所有这一切说明了什么?现在是 2006 年,您好,脚本专家!专栏所要解决的第一个问题就需要用文本文件进行处理。这对于没人使用的过时技术来说还不算坏吧?
假定您有一个类似如下的文本文件:
Line 1Line 2Line 3
而您希望该文本文件看起来是这样:
Line 1Line 2Line 3
使用脚本能够做到这一点吗?当然可以:
Const ForReading = 1Const ForWriting = 2Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)Do Until objFile.AtEndOfStreamstrLine = objFile.ReadlinestrLine = Trim(strLine)If Len(strLine) > 0 ThenstrNewContents = strNewContents & strLine & vbCrLfEnd IfLoopobjFile.CloseSet objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForWriting)objFile.Write strNewContentsobjFile.Close
在了解脚本工作原理的细枝末节之前,让我们先讲一下基本思想。您可能知道,处理文本文件常常包括如何提出解决方法。今天的脚本也不例外。因为我们不能直接编辑文本文件,所以只能这样:首先,逐行读入文本文件。在读每一行时,检查该行是否为空白行。如果是,将其删除;如果不是,将该行(连同任何其他非空白行)添加到一个名为 strNewContents 的变量中。读完该文件后,将文件关闭,然后立即将其重新打开以进行写入。(使用文本文件的一个与众不同之处是:可以读取文件也可以写入文件,但不能同时读取和写入一个文件。)然后将 strNewContents 的值写入该文件。最终结果为:我们得到了一个没有空白行的文件。
您都清楚了吗?好的。现在让我们逐步遍历该脚本。
首先定义一对名为 ForReading 和 ForWriting 的常量,我们将用这两个常量来指定打开文本文件时的相应模式。然后使用以下两行代码创建一个 Scripting.FileSystemObject 实例,并打开 C:\Scripts\Test.txt 文件以进行读取:
Set objFSO = CreateObject("Scripting.FileSystemObject")Set objFile = objFSO.OpenTextFile("C:\Scripts\Test.txt", ForReading)
接下来我们看下面的代码块:
Do Until objFile.AtEndOfStreamstrLine = objFile.ReadlinestrLine = Trim(strLine)If Len(strLine) > 0 ThenstrNewContents = strNewContents & strLine & vbCrLfEnd IfLoop
此处我们所做的是逐行(从开头到末尾)读取该文件,好了,到末尾了。(如何知道已经到达文件末尾?答案是当 AtEndOfStream 属性为 True 时。)
在此循环内部,我们使用 ReadLine 方法来读取文本文件的第一行并将其存储在一个名为 strLine 的变量中。然后使用下行代码和 Trim 函数将该行行首和/或行尾的空格删除:
strLine = Trim(strLine)
为什么这样做?好吧,假定文件中有许多行是由单个空格构成的。再假定您将它们计为空白行并想将其删除。如果不想删除这些行,则只需将该行代码从脚本中删除:
strLine = Trim(strLine)
接下来是下面的代码:
If Len(strLine) > 0 Then
现在我们所做的是用 Len 函数确定行中的字符数。如果 Len 大于 0,则该行不是空白行;因此,我们将该行(再加上一个回车换行符)添加到名为 strNewContents 的变量中:
strNewContents = strNewContents & strLine & vbCrLf
是的,无论变量 strNewContents 中当前含有什么内容,我们都会将该行添加到其中。这就是我们将 strNewContents 的当前值与变量 strLine 及回车换行符(使用 VBScript 常量 vbCrLf)连接在一起的原因。
但如果 Len 不大于 0 将怎样?如果出现这种情况,则表明该行为空白行,因此我们不会将该行添加到 strNewContents 中。然后进入下一轮循环,对文本文件中的下一行重复此过程。
关闭文件 C:\Scripts\Test.txt 后,再将其重新打开(这次进行写入)并调用 Write 方法将 strNewContents 的值写入该文件。为什么会是这样?很简单:因为除空白行外,strNewContents 包括原文本文件中的所有行;我们决不会将空白行添加到 strNewContents 中。那么,我们得到了什么?猜对了:
Line 1Line 2Line 3
虽然有点麻烦,但正如我们所说,这对于“过时”技术来说还不算坏。