5

我正在使用以下方法读取 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;
        }
    }

如果我有一个带有schema.ini的UTF-8编码的 Csv 文件,则此方法有效,如下所示:

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

如果我在Unicode编码的 Csv 文件中有德语字符,则该方法无法正确读取数据。

我可以对上述读取Unicode Csv 文件的方法进行哪些修改?如果没有办法这样做,你能建议什么 CSV 阅读代码?

4

2 回答 2

8

尝试CharacterSet=UNICODE在您的 schema.ini 文件中使用。虽然这在 MSDN 上没有记录,但它根据Microsoft 论坛上的这个线程工作。

于 2009-01-12T08:07:06.640 回答
4

好吧, CodeProject 上有一个非常好的和使用良好的流式 CSV 阅读器;这是我要尝试的第一件事......但听起来你的编码可能很糟糕,这可能不会让它变得简单......当然,它可能只是 odbc 正在破坏,在这种情况下上面可能会工作美好的。

对于简单的 CSV,您可以尝试自己解析它(string.Split等),但有足够的边缘情况值得使用预滚动解析器。

于 2009-01-12T07:40:30.187 回答