如何对文本文件中的项计数?

来源:百度文库 编辑:神马文学网 时间:2024/04/27 03:29:29
问:
嗨,脚本专家!如何对文本文件中的项计数?
-- JA
答:
您好,JA。如果我们没有理解错的话,您是说您有一个由许多行组成的文本文件,每行代表一个特定项。简而言之,假设您的文本文件包括许多城市名称:
CitySeattleSeattleLos AngelesChicagoSeattleLos AngelesPittsburgh
您需要的是可以通读整个文件并报告每个项出现次数的脚本;也就是能返回与下例类似的报告的脚本:
Pittsburgh 1Chicago 1Los Angeles 2Seattle 3
要做到这一点有许多不同的方法,但我们要为您介绍一种非常强大而且灵活的方法可以将文本文件当作数据库来处理(这基本上是您想要达成的目标)。实际上,您可以使用 ADO(ActiveX 数据对象)对文本文件运行数据库查询,尽管这并不广为人知。这正是我们用以下脚本执行的操作:
On Error Resume NextConst adOpenStatic = 3Const adLockOptimistic = 3Const adCmdText = &H0001Set objConnection = CreateObject("ADODB.Connection")Set objRecordset = CreateObject("ADODB.Recordset")strPathtoTextFile = "C:\Scripts"objConnection.Open "Provider=Microsoft.Jet.OLEDB.4.0;" & _"Data Source=" & strPathtoTextFile & ";" & _"Extended Properties=""text;HDR=Yes;FMT=Delimited"""strFile = "City_Names.txt"objRecordset.Open "Select City, Count(City) AS CountOfCity FROM " & strFile & _" GROUP BY City", objConnection, adOpenStatic, adLockOptimistic, adCmdTextDo Until objRecordset.EOFWscript.Echo objRecordset.Fields.Item("City"), objRecordset.Fields.Item("CountOfCity")objRecordset.MoveNextLoop
如您所料,此脚本的大部分用来创建 ADO Connection 和 Recordset 对象,然后将文本文件作为数据库连接。在此,我们不讨论这些步骤的细节;如果您感兴趣,可以参阅脚本诊所专栏中的相关主题。今天我们要集中讨论的是从文本文件检索数据的查询,以及显示返回信息的代码行。
让我们先从用于检索数据的 SQL 查询开始:
objRecordset.Open "Select City, Count(City) AS CountOfCity FROM " & strFile & _" GROUP BY City", objConnection, adOpenStatic, adLockOptimistic, adCmdText
乍一看,您也许会对此查询困惑不解。您大概记得,我们的文本文件只包括一个字段:文件的每行中有一个城市名称,别无其他。但是,尽管我们的“数据库”只有一个字段,SQL 查询却指定了两个单独的项:City 和 Count(City) AS CountOfCity。这是怎么回事?
实际上,我们并未选择两个不同的字段;而只选择了一个字段 (City) 和一个用于计算每个城市在数据库中出现次数的“计算字段”。(计算字段是基于其他字段的数据计算得出的字段;该字段本身并不实际存在于数据库中。)我们可以将 Count(City) AS CountOfCity 项(与 GROUP BY City 子句联用)解读为:计算每个城市在文件中出现的次数,然后将该数字存储在名为 CountOfCity 的计算字段中。
换句话说,此查询将生成如下记录集,Pittsburgh 和 Chicago 为 City 字段的实例而 1 和 1 是计算字段 CountOfCity 的实例:
Pittsburgh 1Chicago 1
可喜的是,我们检索到的记录集含有计算出的城市总数。另一种方法是,打开文本文件,读取每一行,然后使用数组或 Dictionary 对象记录每个城市名在文件中出现的次数。但 ADO 极大简化了这一过程。
您可能也注意到了这一点:我们没有从数据库表中选择(因为我们既没有数据库也没有表),而是在 SQL 查询中指定文本文件的名称。于是,我们从变量 strFile 选择数据,而此变量刚好代表我们文本文件的名称 (City_Names.txt)。
得到记录集后,我们只需用以下代码遍历所有记录,回显城市名和每个城市名在文件中出现的次数:
Do Until objRecordset.EOFWscript.Echo objRecordset.Fields.Item("City"), objRecordset.Fields.Item("CountOfCity")objRecordset.MoveNextLoop
如您所见,我们通过回显 City 和 CountOfCity 这两项的值实现了这一目的。尽管 CountOfCity 是一个计算字段,处理时也把它当作实际存储在数据库中的真实字段。总而言之,这是一个从文本文件检索信息的非常简便的方法(相对于原始数据)。