2015-06-20 2 views
1

Я не могу понять, почему мой скрипт не читает и не сохраняет первую строку файла CSV. По какой-то причине он начинается со второй строки.Не удается прочитать первую строку CSV-файла

У меня есть следующий код (чтение из файла в CSV-2 столбца):

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 вместо этого. См. [This] (https://www.connectionstrings.com/textfile/) примеры строк подключения. – Comintern

+0

Используйте Jet с 'HDR = Yes;', см. Ссылку @Comintern. – omegastripes

+2

@omegastripes Вы имеете в виду 'HDR = No;'. –

ответ

3

Объект считывает первую строку 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 читает первую строку CSV в качестве заголовков таблицы, поэтому вторая строка - первая строка данных». Действительно, это отвечает на мой вопрос. Мне было интересно, почему мой код читал из строки 2, и вы сказали мне, почему (подкрепленные комментариями других людей). Вот почему я принял ответ. Остальное было просто дополнительной помощью, которую вы мне предложили. Я попробую и отправлю отчет. –

+0

Просто попробовал новое предложение строки подключения. Отлично работает! Еще раз спасибо. –

Смежные вопросы