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

问:

您好,脚本专家!我有一个包含计算机名称列表的文本文件。如何按照字母顺序对该文件进行排序?

-- 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 的内容按照字母顺序进行的排序。

(0)

相关推荐

  • VBScript 文件操作代码小结

    创建文本文件 复制代码 代码如下: Set objFSO = CreateObject("Scripting.FileSystemObject") Set objFile = objFSO.CreateTextFile("C:\FSO\ScriptLog.txt") 检察文件是否存在 复制代码 代码如下: Set objFSO = CreateObject("Scripting.FileSystemObject") If objFSO.FileE

  • 用vbs实现读取文本文件的方法

    vbs读取文件方法Function readfile(readfilepath) 'On Error Resume Next     Set fs = CreateObject("Scripting.FileSystemObject")     Set file = fs.OpenTextFile(readfilepath, 1, false)     readfile=file.readall     file.close     set fs=nothing end Functio

  • 使用VBS访问外部文本文件一些方法和脚本实例代码

    处理文件用到的常量有:ForReading = 1 ,ForWriting=2,ForAppending=8,用于的操作分别是读/写和追加,都要在使用之前用VBS Const来声明.常用于处理文本文件的方法有:Read(var)-读var个字符,ReadLine-读一行,ReadAll-读整个文件内容,SkipLine-跳过本行指向下一行,Write(var)-把字符串var写入文件,WriteLine(var)-把字符串var和换行符写入文件,WriteBlankLines(n)-写入n个换行

  • 用vbscript实现从文本文件中删除所有重复行的代码

    问: 您好,脚本专家!如何从文本文件中删除所有重复行? -- SW 答: 您好,SW.您知道,成为一名脚本专家便意味着开始永无止境地寻找给定问题的最终解决方案.(或者至少在我们的经理问为什么我们似乎从未真正完成什么时,我们是这么告诉他的:"老板,永无止境的寻找过程需要时间!")这就是为什么我们很高兴看到您的问题的原因.不久前 我们回答了一个关于从文本文件中删除重复名字的类似问题.我们想到的解决方案十分简单而且效果不错:只是我们不确定那是最佳解决方案.现在,很感谢您的问题,我们可以再次尝

  • 用vbs读取文本文件的最后一行

    问: 您好,脚本专家!如何仅读取文本文件的最后一行? -- BM 答: 您好,BM.如果您曾经想知道您好,脚本专家!与其它每日专栏(比如,知心姐姐)的不同之处,那么,下面是一种途径.假设有人在给知心姐姐的信中说: 知心姐姐: 我的生活一团糟,我需要采取一些措施来应对.我如何能扭转我的生活并且重新快乐起来? 绝望之人于代顿 知心姐姐绝不会给绝望之人这样的答复: 亲爱的绝望之人: 唉,您的生活不能变好了.很抱歉. 那么,您认为脚本专家会如何答复您关于读取文本文件的最后一行呢?答对了: 亲爱的 BM:

  • 用vbs实现对文本文件中的项计数

    问: 嗨,脚本专家!如何向文本文件的顶部添加行? -- FT 答: 您好,FT.您知道,在亚瑟·柯南·道尔爵士生涯的某一时刻,他实际上将夏洛克·福尔摩斯写死了,他认为他已写完了有关这个大侦探所有能写的一切.公众的疾呼很快改变了他的想法,他迅速地使夏洛克·福尔摩斯起死回生.(按照所有肥皂剧的那种基本情节主线一路创作下来.) 我们脚本专家对亚瑟·柯南·道尔爵士深感同情.毕竟,我们会周期性地想,"好了,到这里吧:我们已编写了有关文本文件所有能编写的一切."我们刚有此想法,就立刻收到有关文本文

  • vbs删除文本文件的行的函数

    Delete Line Function 复制代码 代码如下: Function DeleteLine(strFile, strKey, LineNumber, CheckCase) 'DeleteLine Function by TomRiddle 2008 'Remove line(s) containing text (strKey) from text file (strFile) 'or 'Remove line number from text file (strFile) 'or

  • VBS文本文件操作实现代码

    对于文件的操作,例如:生成一个或者打开一个或者删除一个.txt格式文件.虽然官方的FILE插件提供了一些基本功能,但功能不多.你并不需要理解什么是fso模版,什么是vbs语句,直接套用下面的语句吧!红色字为自己定义的部分,蓝色字为任意选一部分 如果你看不懂,请参考下面的例子!操作同一个文件红色部分必须相同 请认真看括号内的解释内容定义一个名为fso的关系文件问题的对象,对于一个文件的操作只需写一次,此句必须写VBS Set fso = CreateObject("Scripting.FileSy

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

    问: 您好,脚本专家!我有一个包含计算机名称列表的文本文件.如何按照字母顺序对该文件进行排序? -- LR 答: 您好,LR.如果想偷懒的话,我们就会告诉您:"对不起,您不能这样做."我们也可以就此脱身,因为 Microsoft 的脚本编写技术中没有一个方法能在打开文本文件后对文件进行排序.不过,嗨,"脚本专家"什么时候偷过懒呢? 噢,对了,我们是偷过几次懒,不过希望所有的人都已经忘了.不过,这次我们将向您提供一个解决办法. 虽然没有能直接对文本文件进行排序的方法,

  • Hadoop对文本文件的快速全局排序实现方法及分析

    一.背景 Hadoop中实现了用于全局排序的InputSampler类和TotalOrderPartitioner类,调用示例是org.apache.hadoop.examples.Sort. 但是当我们以Text文件作为输入时,结果并非按Text中的string列排序,而且输出结果是SequenceFile. 原因: 1) hadoop在处理Text文件时,key是行号LongWritable类型,InputSampler抽样的是key,TotalOrderPartitioner也是用key去

  • C#实现向指定文本文件添加内容的方法

    本文实例讲述了C#实现向指定文本文件添加内容的方法.分享给大家供大家参考.具体实现方法如下: 复制代码 代码如下: using (StreamWriter w = File.AppendText(System.Web.HttpContext.Current.Server.MapPath(path))) {     w.WriteLine("\r\追加的内容");     w.Flush();  //清除此流的缓冲区,内容写入文本 } 希望本文所述对大家的C#程序设计有所帮助.

  • .NET中如何将文本文件的内容存储到DataSet

    前言 项目中对文本文件的操作比较简单,但是如果需要将文本文件的内容写入系统的缓存中,操作起来,会稍微的繁琐一些.现在总结一个较为通用的方法,将文本文件的内容缓存进入DataSet数据集中.下面话不多说了,我们直接来看示例代码吧. 示例代码 private DataSet _iifSet; /// <summary> /// 将文本文件转化为DataSet /// </summary> /// <param name="filePath"></p

  • 易语言设置组合框内容自动排序的方法

    自动排序属性 数据类型:逻辑型: 语法: 对象.自动排序 = 逻辑型 设定对象的内容是否需要排序,默认为"假",即不自动排序. 例程: 说明: 设置组合框的自动排序属性. 运行结果: 总结 以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持.如果你想了解更多相关内容请查看下面相关链接

  • 如何读取文本文件的内容?

    <%Dim writeDim fileSysObj, tf, readread = "intels.txt"' 读取intels.txt. read = LEFT(Server.Mappath(Request.ServerVariables("PATH_INFO")), InStrRev(Server.Mappath(Request.ServerVariables("PATH_INFO")), "\")) & r

  • 巧用DOS命令合并多个文本文件的内容

    (1)首先,使用本书中"批量按序更改文件名"介绍的方法对这100多个文本文件进行按序号重命名: (2)在"命令提示符"窗口中,使用CD命令进入小说文件所在的文件夹: (3)输入"Copy *.txt book.txt"命令并按Enter键执行即可. 稍后,打开小说文件所在的文件夹后,可以看到新生成的book.txt文件的大小正是这100多个文本文件大小的总和,阅读顺序也正是按升序生成的,因此阅读起来很方便. 上次look介绍了使用Word文档合并

  • ajax返回的json内容进行排序使用sort()方法实现

    关键方法:sort()用于对数组的元素进行排序. return a.num-b.num是升序: return b.num-a.num;是降序 writeln在输出后面加\n,在文档里是换行,在html里是解释称空格. 复制代码 代码如下: $.post("json.json",function(data){ data.sort(function(a,b){return a.num-b.num;}); for(var i=0;i<data.length;i++){ var nums

随机推荐