用vbs对文本文件的内容进行排序

所属分类: 脚本专栏 / vbs 阅读数: 588
收藏 0 赞 0 分享
问:
您好,脚本专家!我有一个包含计算机名称列表的文本文件。如何按照字母顺序对该文件进行排序?
-- LR
答:
您好,LR。如果想偷懒的话,我们就会告诉您:“对不起,您不能这样做。”我们也可以就此脱身,因为 Microsoft 的脚本编写技术中没有一个方法能在打开文本文件后对文件进行排序。不过,嗨,“脚本专家”什么时候偷过懒呢?
噢,对了,我们是偷过几次懒,不过希望所有的人都已经忘了。不过,这次我们将向您提供一个解决办法。
虽然没有能直接对文本文件进行排序的方法,但我们可以通过执行以下操作最终达到相同的效果:1) 使用 FileSystemObject 将文件读取到内存中;2) 在内存中按照字母顺序对文件进行排序;3) 使用内存中的已排序的数据替换文件现有的内容。这些操作虽然有点儿绕弯儿,但是您最后将得到一个已按照字母顺序进行排序的文本文件,而这正是您想要的结果。
为了完成此任务,我们选择使用一个断开连接的记录集。还有其他的方法能够实现此目的(比如说,冒泡排序),但是断开连接的记录集能提供更多的灵活性,且更易于讲解,尤其适合于那些曾有过数据库编程经验的用户。我们在此将向您简要介绍断开连接的记录集;若要获得有关其工作原理的详细说明,您可能需要访问 Scripting Week 2 网络广播 Things the Scripting Guys Never Told You(脚本专家从未告诉过您的事情)。(作为额外提供的补充信息,该网络广播还将向您说明如何使用冒泡排序对单个文件数据进行排序。)
在开始之前,我们假定您有一个与以下内容类似的文本文件,文件的每一行都有一个计算机名称:
red-ws-02
atl-ws-01
sf-ws-02
atl-ws-02
atl-ws-03
red-ws-02
sf-ws-01

如何读取这些计算机名称、对它们进行排序并接着将排序后的列表写回该文本文件呢?我们可以使用一个与以下内容类似的脚本:
Const adVarChar = 200
Const MaxCharacters = 255
Const ForReading = 1
Const ForWriting = 2

Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "ComputerName", adVarChar, MaxCharacters
DataList.Open

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\Scripts\Computers.txt", ForReading)

Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    DataList.AddNew
    DataList("ComputerName") = strLine
    DataList.Update
Loop

objFile.Close

DataList.Sort = "ComputerName"

DataList.MoveFirst
Do Until DataList.EOF
    strText = strText & DataList.Fields.Item("ComputerName") & vbCrLf
    DataList.MoveNext
Loop

Set objFile = objFSO.OpenTextFile("C:\Scripts\Computers.txt", ForWriting)

objFile.WriteLine strText
objFile.Close

首先,我们定义要创建断开连接的记录集所需要的一系列常量。(应将断开连接的记录集视为一个只存在于内存中的、与储存在磁盘驱动器上的物理数据库无关的数据库。)然后,我们使用以下这组代码来创建一个由单个字段“ComputerName”组成的断开连接的记录集:
Set DataList = CreateObject("ADOR.Recordset")
DataList.Fields.Append "ComputerName", adVarChar, MaxCharacters
DataList.Open

接下来,我们使用 FileSystemObject 来打开文本文件 C:\Scripts\Computers.txt。此时,我们准备开始对所创建的记录集进行填充。我们要执行的操作就是逐行读取该文本文件。每读取一行,我们都将使用“AddNew”方法向记录集添加一条新记录。我们将 ComputerName 字段的值设置为我们刚才在该文本文件中读取的行(请记住,该文本文件的各行分别表示一个计算机名称),然后使用“Update”方法将记录保存到该记录集。继续执行此操作,直至我们读取完该文本文件的每一行为止,然后我们将关闭该文件。 
是的,这听起来好像工作量很大,但是正如您看到的,所有的操作只需以下几行代码:
Do Until objFile.AtEndOfStream
    strLine = objFile.ReadLine
    DataList.AddNew
    DataList("ComputerName") = strLine
    DataList.Update
Loop

objFile.Close

接下来,我们需要对记录集进行排序。这是使用断开连接的记录集而不使用冒泡排序或其他手动排序算法的主要好处之一。对记录集进行排序只需执行一行代码:
DataList.Sort = "ComputerName"

现在我们就有了一个已排序的记录集,需要使用该记录集将数据写回文本文件。实现此目的最简单的方法就是遍历此记录集、抓取每条记录并将整个记录集保存在一个变量中。这就是下面所执行的操作:
DataList.MoveFirst
Do Until DataList.EOF
    strText = strText & DataList.Fields.Item("ComputerName") & vbCrLf
    DataList.MoveNext
Loop

我们只是看一看各行记录,然后将 ComputerName 字段的值存储在变量 strText 中。请注意我们是如何执行此操作的:我们将 strText 的值设置为 strText 中的任何值加上当前 ComputerName 字段的值,再加上一个回车换行符(这正是 vbCrLf 常量所表示的)。我们将使用内存中的一个名为 strText 的变量来结束此操作,该变量包含以下数据:
atl-ws-01
atl-ws-02
atl-ws-03
red-ws-02
red-ws-02
sf-ws-01
sf-ws-02

最后,重新打开该文本文件(这次是为了写入)并使用“WriteLine”方法将现有的内容替换为 strText 的值。因为 strText 的值就是已排序的计算机名称列表,所以我们就完成了对 C:\Scripts\Computers.txt 的内容按照字母顺序进行的排序。
更多精彩内容其他人还在看

vbscript Split函数用法详解(字符串转数组函数)

本文详细介绍了vbscript中split函数的用法,有关split函数的一些实例,vbscript中split函数的语法介绍,有需要的朋友参考下
收藏 0 赞 0 分享

VBS实现将Excel表格保存为txt文本

希望能够找到个能给excel表另存为TXT的VBS代码,虽然另存为可以选择,但还是需要直接VBS执行这一步另存为TXT格式的,应该如何写代码呢
收藏 0 赞 0 分享

vbs解决处理TXT文本数据相关问题实现代码

使用vbs处理txt数据时,会遇到一些问题,本文将提供详细的解决方法,希望可以帮助你们
收藏 0 赞 0 分享

关于vbs 生成静态页面过程中出现的问题

访问某个aspx页面,然后把服务器返回的页面以filestream 的形式保存为html格式,接下来将介绍实现代码
收藏 0 赞 0 分享

dim函数第三个参数设置截取字符的长度问题

dim函数的第三个参数,也就是截取字符的长度,我在设置这个的时候,出了些问题,提示无效的过程调用或参数,本文详细介绍如何解决
收藏 0 赞 0 分享

邪恶的eval和new Function使用介绍

这些代码可以干什么?可以肯定的是可以干很多猥琐的事
收藏 0 赞 0 分享

WScript.Shell对象SpecialFolders属性未公开文档分享

WshShell对象的SpecialFolders属性返WshSpecialFolders 对象,该对象是一个特殊文件夹集合,其中包含整套Windows特殊文件夹
收藏 0 赞 0 分享

用VBS修改(设置)系统时间和日期的代码

用 VBS 把系统的时间修改到2038年1月19日3时14分07秒之后,这样某些依赖于 Unix 时间戳的程序就会出问题。那么怎样用 VBS 修改系统的时间呢
收藏 0 赞 0 分享

VBS For Next循环的一些细节

For Next 语句是 VBS 中常用的循环语句,你可能已经用过无数次 For Next 循环,但是你是否注意过它的一些细节呢
收藏 0 赞 0 分享

VBS For Next循环的陷阱分享

在《VBS For Next循环的一些细节》中说到了 For Next 循环的控制变量仅仅在循环开始前求值一次,但是其中存在一处陷阱
收藏 0 赞 0 分享
查看更多