我尝试使用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记录都按日期和时间排序。
我使用ADO连接从Excel到CSV文件与此源代码:
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条答案
按热度按时间7bsow1i61#
数据库查询可以很快的原因是数据已经被索引-也就是说,它将在一些字段上具有快速查找。当您对原始CSV文件运行"查询"时,ADO引擎必须首先将文本解析为记录,然后再解析为一组记录,然后逐行搜索它们以查找与搜索条件匹配的记录。如果您计划对数据执行多个查询,您还可以将其导入到 IndexedDB 表中,以避免多次解析CSV的重复。
要从VBA导入CSV文件,您可以使用'DoCmd.TransferText' function。例如,要将CSV文件导入名为"tblData"的表(具有正确的布局),以及从逗号分隔的带标题的CSV导入CSV文件,您可以执行以下操作:
这与Access导入向导使用的方法相同。