Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Vba 大型CSV文件的select查询的性能问题_Vba_Excel_Vb6 - Fatal编程技术网

Vba 大型CSV文件的select查询的性能问题

Vba 大型CSV文件的select查询的性能问题,vba,excel,vb6,Vba,Excel,Vb6,我试图使用ADO SELECT查询在一个非常大的CSV文件中搜索一百万条记录中的数据,我在该查询中有几个WHERE子句 我无法将此数据传输到任何数据库MySql或SQL Server或MS Access,因为它是每天生成的,我无法每天将其传输到数据库 我在此.csv文件中没有任何行id。如果默认情况下为每个.csv生成了行id,请告诉我 以下是CSV文件数据示例第一个字段是日期,第二个字段是时间,第三个字段是值: CSV FILE SAMPLE DATA ====================

我试图使用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分钟。如何减少执行时间?

数据库查询之所以可以快速,是因为数据已经编制了索引,也就是说,它可以快速查找某些字段。当您在原始CSV文件上运行查询时,ADO引擎必须首先将文本解析为记录并将其转换为一组记录,然后逐行搜索这些记录,以查找符合搜索条件的记录。如果您计划对数据进行更多的查询,那么您最好将其导入到一个索引数据库表中,并避免多次解析CSV的重复

更新

要从VBA导入CSV文件,可以使用。例如,要将CSV文件导入到名为tblData的具有正确布局的表中,并从带有标题的逗号分隔CSV导入,可以执行以下操作:

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

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

速度可能受In SELECT xxx语句的影响。您是否可以编写查询而不使用子查询?基于这个子查询,看起来您可以将sDay和sTime参数放在主查询中,只需做一点工作,trigWin也可以。同样,您的SQL语句基本上说,如果价格高于x值,并且日期在y日期或之后,如果在z日期和p时间之后发生了某些事情,请提供所有记录。例如,如果输入“20130714”和“170522”,则返回上面的所有行。这就是您想要的吗?我使用select*是因为我想要一行的所有三个值作为结果集。此查询仅返回特定行的3个值。有没有比执行子查询更快的方法?我必须首先在csv中找到特定日期后的前3个不同的可用日期,然后我必须查询这3个日期的数据,这就是我使用子查询的原因,如果您知道任何更快的方法,请发送代码我同意。将文本文件导入动态创建的临时Jet MDB,通过SQL DML添加任何所需的索引,执行查询,完成后将MDB扔掉,这是一件非常简单的事情。您认为首先在MDB文件中插入100万条记录,然后再查询它们会更快吗?因为我必须运行至少40个查询。我的数据已具有唯一id。。。看看我随附的CSV数据。第一个字段包含一个按顺序排列的日期值,我不完全确定您在做什么。我相信你的约会不是独一无二的,因为100万个独一无二的约会似乎是难以置信的。我创建了一个100万条记录的测试用例,每个日期内有1000个唯一日期和1000个唯一时间,我得到的结果是:查询CSV文本花费了7.41秒,使用导入的数据查询MDB需要2.43秒。顺便说一句:创建新MDB、导入100万条文本记录以及为所有3个字段编制索引需要9.2秒。@user3143422因为您必须运行40多个查询,所以首先将数据导入Access数据库会更快。正如Bob77所指出的,在他的例子中,初始导入和索引需要额外的时间9.2秒,但由于每个查询所需的时间要少得多,因此总时间会减少。