快速业务通道

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

作者 佚名 来源 ASP编程 浏览 发布时间 2013-07-09
问:
您好,脚本专家!如何从文本文件中删除所有重复行?

--SW

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

首先,假定您有一个文本文件,其中每一行都表示一条单独的记录。这似乎不太可能,但也许您的文件类似如下:

Thisisoneofthelinesinthetextfile.
Thisisoneofthelinesinthetextfile.
Thisisanotherlineinthetextfile.
Thisisoneofthelinesinthetextfile.
Thisisyetanotherlineinthetextfile.
Thisisanotherlineinthetextfile.
Thisisanotherlineinthetextfile.
Thisisoneofthelinesinthetextfile.

您需要一个可以除去所有重复行并提供类似以下输出的脚本:

Thisisoneofthelinesinthetextfile.
Thisisanotherlineinthetextfile.
Thisisyetanotherlineinthetextfile.

SW,您找对地方了:

ConstadOpenStatic=3
ConstadLockOptimistic=3
ConstadCmdText=&H0001

SetobjConnection=CreateObject("ADODB.Connection")
SetobjRecordSet=CreateObject("ADODB.Recordset")

strPathToTextFile="C:\Scripts\"
strFile="Test.txt"

objConnection.Open"Provider=Microsoft.Jet.OLEDB.4.0;"&_
"DataSource="&strPathtoTextFile&";"&_
"ExtendedProperties=""text;HDR=NO;FMT=Delimited"""

objRecordSet.Open"SelectDISTINCT*FROM"&strFile,_
objConnection,adOpenStatic,adLockOptimistic,adCmdText

DoUntilobjRecordSet.EOF
Wscript.EchoobjRecordSet.Fields.Item(0).Value
objRecordSet.MoveNext
Loop

我们发现此脚本有些有趣,因为我们使用“ActiveX数据对象”(ADO)并将此文本文件当作数据库处理。我们不会花费过多的时间详细说明如何将文本文件当作数据库处理;如果您想了解有关于此的详细信息,我们的脚本诊所专栏对此主题进行了深入阐述。现在,要说明的只是我们将使用文本文件C:\Scripts\Test.txt,我们通过为变量strPathToTextFile和strFile赋予相应值来表示:

strPathToTextFile="C:\Scripts\"
strFile="Test.txt"

那么,这如何能让我们除去重复行呢?是这样的,有一种称为SelectDISTINCT的数据库查询;利用SelectDISTINCT可以选择表格中所有不同的(或唯一的)记录。假设您有一个简单的数据库,其中有以下记录:


Red
Red
Blue
Red

如果使用SelectDISTINCT查询,您将得到一个只包括唯一记录的记录集:

Red
Blue

毫无疑问,您会想:“哇!返回唯一记录与删除重复记录简直异曲同工。”我们承认确实如此–嗯,请等一下:您的想法绝对正确。我们的文本文件构建得就像一个数据库表,文本文件中的每行都表示一条记录中的一个字段。如果对此文本文件运行SelectDISTINCT查询,我们将只得到唯一的行。事实上,我们将得到如下所示的记录集:

Thisisoneofthelinesinthetextfile.
Thisisanotherlineinthetextfile.
Thisisyetanotherlineinthetextfile.

这刚好就是我们希望返回的信息。您为我们指出了这一点,这很好!

检索记录集后,我们再使用以下代码将唯一的行回显到屏幕:

DoUntilobjRecordset.EOF
Wscript.EchoobjRecordset.Fields.Item(0).Value
objRecordset.MoveNext
Loop

如果我们愿意,也可以使用FileSystemObject打开文本文件,然后仅用唯一的行替换现有内容;此种方法与从文本文件中删除所有重复行效果相同。(如果我们能使用某种Update查询执行此操作,效果会很好,但处理文本文件时,ADO却是只读的。)

那么,这是从文本文件删除重复项(无论是姓名还是整个行)的最终结论吗?唉,谁知道:毕竟,永无止境的寻找过程需要时间!(实际上,我们发现这只需要大约2到3天。然后,我们便开始觉得无聊,又继续做其他事情。)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号