C# 从CSV文件创建数据表

C# 从CSV文件创建数据表,c#,visual-studio,C#,Visual Studio,我正在做一个项目,我需要读取一个CSV文件,然后用它的数据填充数据集。我一直在搜索,在OleDB中发现了一些有趣的东西 我有一个CSVReader类: class CSVReader { public DataTable GetDataTable(string filePath) { OleDbConnection conn = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.Jet.OleDb.

我正在做一个项目,我需要读取一个CSV文件,然后用它的数据填充数据集。我一直在搜索,在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);
问题在于,它将第一行(标题行)解析为列的一个标识符,我的意思是:这是CSV文件的标题:

Name, Product Name, Server, Vendor, Start Time, End Time, Host Name, User Name, Project Name, Usage time (hours)
之后是所有数据,用逗号分隔

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

有什么帮助吗

提前谢谢。

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

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

我总是使用这个CSV库通过C读取CSV文件,这对我来说总是很好

下面是使用库读取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();
        }
    }
}
使用System.IO;
使用LumenWorks.Framework.IO.Csv;
void ReadCsv()
{
//打开文件“data.csv”,这是一个带有标题的csv文件
使用(CsvReader csv)=
新的CsvReader(新的StreamReader(“data.csv”),真)
{
int fieldCount=csv.fieldCount;
string[]headers=csv.GetFieldHeaders();
而(csv.ReadNextRecord())
{
对于(int i=0;i
尝试在扩展属性中包含IMEX,这将告诉驱动程序您有混合模式数据

Text;HDR=YES;FMT=Delimited;IMEX=1
内置了对读入
数据集的支持

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

我发现的最好的选择是,它可以解决安装了不同版本的Office以及32/64位问题

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

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

我的解决方案的可能副本与jimscott()相同,但不起作用:S-1。按换行符拆分不是CSV解析的方法。如果是这么简单的话,就不会有任何库了。