【问题标题】:Creating a DataTable from CSV File从 CSV 文件创建数据表
【发布时间】:2011-03-19 09:24:51
【问题描述】:

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

有什么帮助吗?

提前致谢。

【问题讨论】:

标签: c# visual-studio


【解决方案1】:

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

可以使用 NuGet 将其添加到您的项目引用中,并提供单线解决方案:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      KBCsv 内置支持读入DataSet

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

      【讨论】:

        【解决方案4】:

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

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

        【讨论】:

        • -1。换行符分割不是你应该如何处理 CSV 解析。如果就这么简单,就不会有任何图书馆了。
        【解决方案5】:

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

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

        【讨论】:

          猜你喜欢
          • 2015-05-10
          • 1970-01-01
          • 2018-04-14
          • 2015-03-09
          • 2016-04-29
          • 1970-01-01
          • 2017-01-24
          • 1970-01-01
          • 2011-02-06
          相关资源
          最近更新 更多