2015-06-20 113 views
1

我无法弄清楚为什么我的脚本没有读取和存储CSV文件的第一行。由于某种原因,它从第二行开始。无法读取CSV文件的第一行

我有以下代码(从2列CSV文件读取):

Set rs = CreateObject("ADOR.Recordset") 

'this just gets the folder where the csv file lives 
sDir = GetiMacrosFolder("DataSources") 

strConnect = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _ 
      "DefaultDir=" & sDir & ";" 

rs.Open "select * from test.csv", strConnect 

count = 0 

Do Until rs.EOR 
    ReDim Preserve var1(count) 
    var1(count) = rs.fields(0) 

    ReDim Preserve var2(count) 
    var2(count) = rs.fields(1) 

    count = count + 1 
    rs.MoveNext 
Loop 

rs.Close 

如果我那么做了MsgBox(var1(1)),它让我在3行的值,而不是排2像它应该。

+0

@AnsgarWichers答案是正确的 - 如果文件没有标题,则可以使用Jet驱动程序。请参阅[这些](https://www.connectionstrings.com/textfile/)示例连接字符串。 – Comintern

+0

使用Jet'HDR = Yes;',请参阅@Comintern链接。 – omegastripes

+2

@omegastripes你的意思是'HDR =否;'。 –

回答

3

Recordset对象将CSV的第一行作为表格标题读取,因此第二行是第一行数据。您可以使用,你可以指示司机不这样做避免这种情况是:

strConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & sDir & _ 
      ";Extended Properties=""text;HDR=No;FMT=Delimited"";"

,或者通过将schema.ini这样旁边的CSV:

[test.csv] 
Format=CSVDelimited 
ColNameHeader=False 
MaxScanRows=0 
CharacterSet=ANSI 

注意CSVDelimited只能当您的文件实际上是用逗号分隔的,您的逗号定义为系统区域设置中的字段分隔符。否则,您需要在该文件中指定您的分隔符:

[test.csv] 
Format=Delimited(<delimiter>) 
ColNameHeader=False 
MaxScanRows=0 
CharacterSet=ANSI
+0

非常感谢所有的信息和例子!我会试试这个。 –

+0

那么,我实际上会接受你的答案,因为它只是“Recordset对象读取表头的第一行的第一句话,所以第二行是第一行数据。”真的,这回答了我的问题。我想知道为什么我的代码从第2行读取,并告诉我为什么(由其他人的评论支持)。这就是我接受答案的原因。剩下的只是你提供给我的额外帮助。我会尝试一下并报告。 –

+0

刚刚尝试了您的新连接字符串建议。工作完美!再次感谢。 –