选择查询大型CSV文件的性能问题

时间:2014-01-17 18:54:38

标签: vba excel-vba vb6 excel

我正在尝试使用ADO SELECT查询在一个非常大的CSV文件(一百万条记录)中搜索数据,并且该查询中有一些WHERE子句。

我无法将此数据传输到任何数据库(MySql或SQL Server或MS Access),因为它是每天生成的,我不能每天将其传输到数据库。

我的.csv文件中没有任何行ID。如果默认为每个.csv生成一个行ID,请告诉我。

这是CSV文件数据样本(第一个字段是日期,第二个是时间,第三个是值):

CSV FILE SAMPLE DATA
====================
20130714,170056,1.30764
20130714,170122,1.30743
20130714,170132,1.30744
20130714,170205,1.30743
20130714,170214,1.30744
20130714,170216,1.30743
20130714,170244,1.30744
20130714,170325,1.30744
20130714,170325,1.30743
20130714,170325,1.30743
20130714,170325,1.30742
20130714,170504,1.30741
20130714,170519,1.30741
20130714,170519,1.30739
20130714,170522,1.30739
20130714,170522,1.30732
20130714,170522,1.30722

所有CSV记录按日期和时间排序。

我正在使用这个源代码从Excel到CSV文件的ADO连接:

strsql = "SELECT * FROM " & sItem & ".csv WHERE F3>=" & trigPrice & " AND (F1 in (SELECT distinct TOP " & trigWin & "  f1 FROM " & sItem & ".csv WHERE (F1>=" & sDay & ")) AND f2>=" & sTime & ")"
Set rs = cn.Execute(strsql)

这一个查询大约需要10分钟才能执行。如何缩短执行时间?

1 个答案:

答案 0 :(得分:1)

数据库查询速度快的原因是数据已经被索引 - 也就是说,它会在某些字段上快速查找。当您对原始CSV文件运行“查询”时,ADO引擎必须首先将文本解析为记录到一组记录中,然后逐行搜索它们以查找与您的搜索条件匹配的记录。如果您计划对数据进行多次查询,则可以将其导入索引数据库表,并避免重复解析CSV多次。

<强>更新

要从VBA导入CSV文件,您可以使用'DoCmd.TransferText' function。例如,要将CSV文件导入名为“tblData”的表(具有正确的布局),并从带有标题的逗号分隔CSV导入,您可以执行以下操作:

DoCmd.TransferText acImportDelim, , "tblData", "C:\Path\OF\THE.csv", True

这与访问导入向导使用的方法相同。