从CSV文件创建DataTable

我正在研究一个项目,我需要读取一个CSV文件,然后用其数据填充DataSet。 我一直在寻找,我在OleDB中找到了一些有趣的东西。

我有一个类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); 

问题是它解析了第一行(标题行),就像列的JUST ONE标识符一样,我的意思是:这是CSV文件的标题:

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

之后,所有数据都以逗号分隔。

当我读取文件时,填充数据集并打印dt.Columns.Count,它显示它只有1列。

有帮助吗?

提前致谢。

我总是使用这个CSV库通过C#读取CSV文件,它总是对我有用。

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

下面是使用该库读取CSF文件的示例

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

我找到的最佳选项,它解决了您可能安装了不同版本的Office以及32/64位问题的问题,即FileHelpers 。

它可以使用NuGet添加到您的项目参考中,它提供了一个单线解决方案:

 CommonEngine.CsvToDataTable(path, "ImportRecord", ',', true); 

KBCsv内置支持读取DataSet

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

如果没什么特别我使用这种代码

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

尝试在扩展属性中包含IMEX,这将告诉驱动程序您有混合模式数据

 Text;HDR=YES;FMT=Delimited;IMEX=1