2009-01-12 68 views
4

我使用下面的方法讀取的CSV文件內容:閱讀的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 

如果我有德國的字符在CSV與統一編碼文件,該方法不能正確讀取數據。

可以對上述方法做些什麼修改Unicode Csv文件?如果沒有辦法這樣做,你可以建議什麼樣的Csv閱讀代碼?

回答

3

那麼,一個非常好用的流式CSV閱讀器is on CodeProject;這是我嘗試的第一件事......但它聽起來像你的編碼可能是borked,這可能並不簡單......當然,它可能只是odbc打破,在這種情況下上述可能工作精細。

對於簡單的CSV,你可以嘗試自己解析它(string.Split等),但是有足夠的邊緣情況,預滾動分析器值得使用。

+1

+1爲CsvReader :) – CMS 2009-01-12 07:43:36