分享

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

 星爷 2006-04-28

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

问:

嗨,脚本专家!如何对文本文件中的项计数?

-- JA

答:

您好,JA。如果我们没有理解错的话,您是说您有一个由许多行组成的文本文件,每行代表一个特定项。简而言之,假设您的文本文件包括许多城市名称:

City
Seattle
Seattle
Los Angeles
Chicago
Seattle
Los Angeles
Pittsburgh

您需要的是可以通读整个文件并报告每个项出现次数的脚本;也就是能返回与下例类似的报告的脚本:

Pittsburgh 1
Chicago 1
Los Angeles 2
Seattle 3

要做到这一点有许多不同的方法,但我们要为您介绍一种非常强大而且灵活的方法可以将文本文件当作数据库来处理(这基本上是您想要达成的目标)。实际上,您可以使用 ADO(ActiveX 数据对象)对文本文件运行数据库查询,尽管这并不广为人知。这正是我们用以下脚本执行的操作:

On Error Resume Next
Const adOpenStatic = 3
Const adLockOptimistic = 3
Const adCmdText = &H0001
Set 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, adCmdText
Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("City"), objRecordset.Fields.Item("CountOfCity")
objRecordset.MoveNext
Loop

如您所料,此脚本的大部分用来创建 ADO ConnectionRecordset 对象,然后将文本文件作为数据库连接。在此,我们不讨论这些步骤的细节;如果您感兴趣,可以参阅脚本诊所专栏中的相关主题。今天我们要集中讨论的是从文本文件检索数据的查询,以及显示返回信息的代码行。

让我们先从用于检索数据的 SQL 查询开始:

objRecordset.Open "Select City, Count(City) AS CountOfCity FROM " & strFile & _
" GROUP BY City", objConnection, adOpenStatic, adLockOptimistic, adCmdText

乍一看,您也许会对此查询困惑不解。您大概记得,我们的文本文件只包括一个字段:文件的每行中有一个城市名称,别无其他。但是,尽管我们的“数据库”只有一个字段,SQL 查询却指定了两个单独的项:CityCount(City) AS CountOfCity。这是怎么回事?

实际上,我们并未选择两个不同的字段;而只选择了一个字段 (City) 和一个用于计算每个城市在数据库中出现次数的“计算字段”。(计算字段是基于其他字段的数据计算得出的字段;该字段本身并不实际存在于数据库中。)我们可以将 Count(City) AS CountOfCity 项(与 GROUP BY City 子句联用)解读为:计算每个城市在文件中出现的次数,然后将该数字存储在名为 CountOfCity 的计算字段中。

换句话说,此查询将生成如下记录集,PittsburghChicagoCity 字段的实例而 1 1 是计算字段 CountOfCity 的实例:

Pittsburgh 1
Chicago 1

可喜的是,我们检索到的记录集含有计算出的城市总数。另一种方法是,打开文本文件,读取每一行,然后使用数组或 Dictionary 对象记录每个城市名在文件中出现的次数。但 ADO 极大简化了这一过程。

您可能也注意到了这一点:我们没有从数据库表中选择(因为我们既没有数据库也没有表),而是在 SQL 查询中指定文本文件的名称。于是,我们从变量 strFile 选择数据,而此变量刚好代表我们文本文件的名称 (City_Names.txt)。

得到记录集后,我们只需用以下代码遍历所有记录,回显城市名和每个城市名在文件中出现的次数:

Do Until objRecordset.EOF
Wscript.Echo objRecordset.Fields.Item("City"), objRecordset.Fields.Item("CountOfCity")
objRecordset.MoveNext
Loop

如您所见,我们通过回显 CityCountOfCity 这两项的值实现了这一目的。尽管 CountOfCity 是一个计算字段,处理时也把它当作实际存储在数据库中的真实字段。总而言之,这是一个从文本文件检索信息的非常简便的方法(相对于原始数据)。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多