oledbdataadapter не может прочитать определенную ячейку в определенном состоянии из csv

У меня есть файл csv со следующими данными:

FIBO.csv

41,3
36445122,EURUSD,4,0.01,1.05828,1,1.00881,10,66
36445121,EURUSD,4,0.01,1.05828,1,1.00881,10,66
36445120,EURUSD,4,0.01,1.05828,1,1.00881,10,66

Когда я читаю этот файл с помощью провайдера OLEDB, он правильно возвращает идеальную таблицу данных.

Этот код здесь:

public DataTable CsvFileToDatatable(string path, bool IsFirstRowHeader)
{
    string header = "No";
    string sql = string.Empty;
    DataTable dataTable = new DataTable();
    string pathOnly = string.Empty;
    string fileName = string.Empty;
    try
    {
        pathOnly = System.IO.Path.GetDirectoryName(path);
        fileName = System.IO.Path.GetFileName(path);
        sql = @"SELECT * FROM [" + fileName + "]";
        if (IsFirstRowHeader)
        {
            header = "Yes";
        }
        using (OleDbConnection connection = new OleDbConnection(@"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly +
            ";Extended Properties=\"Text;IMEX = 1;HDR=" + header + "\""))
        {
            using (OleDbCommand command = new OleDbCommand(sql, connection))
            {
                using (OleDbDataAdapter adapter = new OleDbDataAdapter(command))
                {
                    dataTable = new DataTable();
                    dataTable.Locale = CultureInfo.CurrentCulture;
                    adapter.Fill(dataTable);
                }
            }
        }
    }
    catch
    {
        if (dataTable == null)
            dataTable = new DataTable();
    }
    finally
    {
    }
    return dataTable;
}

НО, когда файл csv имеет такие значения:

41,3
36445122,EURUSD,4,0.01,1.05828,1,1.00881,10,66

то в возвращаемой таблице данных отсутствует EURUSD.

Если я добавлю еще одну строку, все данные вернутся отлично. Проблема возникает, только если у меня есть две строки, как чуть выше.

У меня было несколько таких файлов, и все они имеют одинаковые проблемы. Я не уверен, что с этим не так.

Я поставил IMEX=1, но ничего не работает.


person Abdur Rahim    schedule 13.03.2017    source источник
comment
Каково значение вашего заголовка переменной?   -  person Frederic    schedule 14.03.2017
comment
Нет, я использовал TypeGuessRows=0. но это заставило мои первые два заголовка столбца исчезнуть, и вместо этого он показывает 41,1..., которые были моей первой строкой. и в первой строке полная строка данных отображается с EURUSD   -  person Abdur Rahim    schedule 14.03.2017
comment
Если вы оберните каждое значение в CSV-файле кавычками, это сработает. Но есть ли у вас контроль над входными данными? 41,3 36445122,EURUSD,4,0,01,1,05828,1,1,00881,10,66   -  person Frederic    schedule 14.03.2017
comment
Нет, у меня нет контроля. Я не могу это сделать.   -  person Abdur Rahim    schedule 14.03.2017


Ответы (1)


Как обсуждалось здесь, похоже, это ошибка JET.OLEDB.4.

Вместо использования OleDbConnection проверьте эту стороннюю библиотеку KBCsv. Я пробовал это, как показано ниже, и это сработало:

FileStream stream = new FileStream(ope.FileName, FileMode.Open);
using (CsvReader reader = new CsvReader(stream))
{
    while (reader.HasMoreRecords)
    {
        DataRecord record = reader.ReadDataRecord();
        string row0 = record[0];
        string row1 = record[1];
        Console.WriteLine($"{row0}, {row1}");
    }
}

Ниже приведен вывод после запуска моего кода выше:

41,3
36445122,EURUSD
person Frederic    schedule 13.03.2017
comment
спасибо за ваш быстрый ответ. как работает TypeGuessRows? - person Abdur Rahim; 14.03.2017