2010-07-22 128 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