2010-07-22 129 views
6

我正在開發一個項目,我需要讀取一個CSV文件,然後用它的數據填充DataSet。我一直在尋找,並且在OleDB中發現了一些有趣的東西。從CSV文件創建數據表

我有一個類CSVReader:

class CSVReader 
{ 
    public DataTable GetDataTable(string filePath) 
    { 
     OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(filePath) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""); 
     conn.Open(); 
     string strQuery = "SELECT * FROM [" + Path.GetFileName(filePath) + "]"; 
     OleDbDataAdapter adapter = new OleDbDataAdapter(strQuery, conn); 
     DataSet ds = new System.Data.DataSet("CSV File"); 
     adapter.Fill(ds); 
     return ds.Tables[0]; 
    } 
} 

我調用它從這裏:

CSVReader datareader = new CSVReader(); 
DataTable dt = datareader.GetDataTable(filepath); 

的問題是,它解析的第一行(標題行)等只有一個標識符該列,我的意思是:這是CSV文件的標題:

Name, Product Name, Server, Vendor, Start Time, End Time, Host Name, User Name, Project Name, Usage time (hours) 

而之後,所有的數據被逗號隔開。

當我讀取文件時,填寫數據集並打印dt.Columns.Count它顯示它只有1列。

任何幫助?

在此先感謝。

+0

可能重複:// stackoverflow.com/questions/1050112/how-to-read-a-csv-file-into-a-net-datatable) – 2010-07-22 06:37:14

+0

我的解決方案與Jim Scott相同(http://stackoverflow.com/questions/1050112/如何閱讀一個csv文件到一個網絡數據表/ 1050278#1050278),但它不工作:S – 2010-07-22 06:43:49

回答

7

我一直用這個CSV庫,通過C#讀取CSV文件,它總是爲我工作好。

http://www.codeproject.com/KB/database/CsvReader.aspx

赫雷什的使用庫

using System.IO; 
using LumenWorks.Framework.IO.Csv; 

void ReadCsv() 
{ 
    // open the file "data.csv" which is a CSV file with headers 
    using (CsvReader csv = 
      new CsvReader(new StreamReader("data.csv"), true)) 
    { 
     int fieldCount = csv.FieldCount; 
     string[] headers = csv.GetFieldHeaders(); 

     while (csv.ReadNextRecord()) 
     { 
      for (int i = 0; i < fieldCount; i++) 
       Console.Write(string.Format("{0} = {1};", 
           headers[i], csv[i])); 

      Console.WriteLine(); 
     } 
    } 
} 
+0

完美。這很好。 謝謝! – 2010-07-28 06:04:31

+0

喜歡這個圖書館。 – noelicus 2012-11-07 17:05:45

1

,如果沒有什麼特別的 我使用 這種代碼

TextReader tr1 = new StreamReader(@"c:\pathtofile\filename",true); 

var Data = tr1.ReadToEnd().Split('\n') 
.Where(l=>l.Length>0) //nonempty strings 
.Skip(1)    // skip header 
.Select(s=>s.Trim()) // delete whitespace 
.Select(l=>l.Split(',')) // get arrays of values 
.Select(l=>new {Field1=l[0],Field2=l[1],Field3=l[2]}); 
+0

非常整齊,非常輕巧 - 做得好! – 2013-07-22 07:38:18

+0

-1。用換行符分割並不是你應該如何處理CSV解析。如果那麼簡單,那裏就不會有任何圖書館。 – Neolisk 2014-01-16 21:29:46

0

嘗試包括IMEX在擴展屬性,這將告訴你已經混合模式數據

Text;HDR=YES;FMT=Delimited;IMEX=1 
駕駛員讀取CSF文件的示例
2

KBCsv內置支持讀取到DataSet

using (var reader = new CsvReader(@"C:\data.csv")) { 
    reader.ReadHeaderRecord(); 
    var dataSet = new DataSet(); 
    reader.Fill(dataSet, "csv-data"); 
} 
5

我發現的最佳選擇,它解決了您可能安裝了不同版本的Office以及32/64位問題的問題,它是FileHelpers

它可以添加到使用的NuGet項目的引用,它提供了一個班輪解決方案:

CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true); 
的[如何讀取csv文件到.NET數據表(HTTP