从CSV文件创建DataTable

时间:2010-07-22 06:36:01

标签: c# visual-studio

我正在处理一个项目,我需要读取一个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列。

任何帮助?

提前致谢。

5 个答案:

答案 0 :(得分:7)

我总是使用这个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();
        }
    }
}

答案 1 :(得分:6)

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

可以使用NuGet将其添加到项目引用中,它提供了一个单行解决方案:

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

答案 2 :(得分:2)

KBCsv内置支持阅读DataSet

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

答案 3 :(得分: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]});

答案 4 :(得分:0)

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

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