Ошибка чтения файла CSV - PullRequest
       15

Ошибка чтения файла CSV

5 голосов
/ 12 января 2009

Я использую следующий метод для чтения содержимого файла CSV:

    /// <summary>
    /// Reads data from a CSV file to a datatable
    /// </summary>
    /// <param name="filePath">Path to the CSV file</param>
    /// <returns>Datatable filled with data read from the CSV file</returns>
    public DataTable ReadCsv(string filePath)
    {
        if (string.IsNullOrEmpty(filePath))
        {
            log.Error("Invalid CSV file name.");
            return null;
        }

        try
        {
            DataTable dt = new DataTable();

            string folder = FileMngr.Instance.ExtractFileDir(filePath);
            string fileName = FileMngr.Instance.ExtractFileName(filePath);
            string connectionString = 
            string.Concat(@"Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=",
            folder, ";");

            using (OdbcConnection conn = 
                   new System.Data.Odbc.OdbcConnection(connectionString))
            {
                string selectCommand = string.Concat("select * from [", fileName, "]");
                using (OdbcDataAdapter da = new OdbcDataAdapter(selectCommand, conn))
                {
                    da.Fill(dt);
                }
            }

            return dt;
        }
        catch (Exception ex)
        {
            log.Error("Error loading CSV content", ex);
            return null;
        }
    }

Этот метод работает, если у меня есть Csv-файл в кодировке UTF-8 с schema.ini , который выглядит примерно так:

[Example.csv]
Format=Delimited(,)
ColNameHeader=True
MaxScanRows=2
CharacterSet=ANSI

Если у меня есть немецкие символы в файле CSV с кодировкой Unicode , метод не может правильно прочитать данные.

Какие изменения можно внести в вышеуказанный метод для чтения Unicode CSV-файлов? Если нет способа сделать это таким образом, какой код для чтения CSV вы можете предложить?

Ответы [ 2 ]

8 голосов
/ 12 января 2009

Попробуйте использовать CharacterSet=UNICODE в файле schema.ini. Хотя это не задокументировано на MSDN , оно работает в соответствии с этой веткой на форумах Microsoft .

3 голосов
/ 12 января 2009

Ну, очень хороший и хорошо используемый потоковый ридер CSV находится на CodeProject ; это первое, что я попробую ... но звучит так, будто ваша кодировка может быть сорвана, что не может сделать ее простой ... конечно, это может быть просто odbc, который ломается, и в этом случае вышеприведенное может работать хорошо.

Для простого CSV вы можете попробовать разобрать его самостоятельно (string.Split и т. Д.), Но есть достаточно крайних случаев, которые стоит использовать для предварительно свернутого парсера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...