读取 Csv 文件时出现编码错误

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;
        }
    }

如果我有一个使用UTF-8编码的Csv文件和一个类似于这样的schema.ini,那么这种方法就可以使用:

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

如果我在使用Unicode编码的Csv文件中有德语字符,那么该方法将无法正确读取数据。
如何修改上述方法以读取Unicode Csv文件?如果没有这样的方法,您可以建议哪些Csv读取代码呢?
2个回答

8

尝试在您的schema.ini文件中使用CharacterSet=UNICODE。虽然这不是MSDN文档中记录的,但根据此Microsoft论坛主题它可以正常工作。


这可能就是我正在寻找的!我现在正在尝试。 - Germstorm
这个东西好使!这是非常有用的信息!谢谢! - Germstorm
我在连接字符串中使用了这个,而不是schema.ini文件,但它的效果一样。 - Aaron Smith
@Aaron Smith,能否给我发送一下你的连接字符串示例,说明一下如何在不使用schema.ini文件的情况下使用它? - Sasha
@msony Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:;Extended Properties=""text;HDR=Yes;CharacterSet=UNICODE;FMT=Delimited" - Aaron Smith

4

嗯,CodeProject上有一个非常好用且广泛使用的流式CSV阅读器我会首先尝试使用它...但听起来你的编码可能出了问题,这可能并不简单...当然,也可能只是ODBC出了问题,在这种情况下,上述方法可能很好用。

对于简单的CSV文件,您可以尝试自己解析它(string.Split等),但是由于存在足够多的边缘案例,因此值得使用预先打包的解析器。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接