代码之家  ›  专栏  ›  技术社区  ›  Germstorm Pierre-Alain Vigeant

读取Csv文件编码错误

  •  4
  • Germstorm Pierre-Alain Vigeant  · 技术社区  · 16 年前

        /// <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 看起来是这样的:

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

    我可以对上述方法进行哪些修改以阅读 统一码

    2 回复  |  直到 16 年前
        1
  •  8
  •   csgero    16 年前

    试用 CharacterSet=UNICODE 在schema.ini文件中。虽然这不是 documented on MSDN 它就是这样工作的 thread on Microsoft Forums .

        2
  •  4
  •   Marc Gravell    16 年前

    这是一款非常好用的流式CSV阅读器 is on CodeProject ; 这是我要做的第一件事。。。但听起来你的编码可能有问题,这可能不简单。。。当然,可能是odbc正在崩溃,在这种情况下,上述方法可能可以正常工作。

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