How to read a CSV file into a .NET Datatable

后端 未结 22 2128
野性不改
野性不改 2020-11-22 05:12

How can I load a CSV file into a System.Data.DataTable, creating the datatable based on the CSV file?

Does the regular ADO.net functionality allow this?

相关标签:
22条回答
  • 2020-11-22 05:47

    Here's an excellent class that will copy CSV data into a datatable using the structure of the data to create the DataTable:

    A portable and efficient generic parser for flat files

    It's easy to configure and easy to use. I urge you to take a look.

    0 讨论(0)
  • 2020-11-22 05:47

    Modified from Mr ChuckBevitt

    Working solution:

    string CSVFilePathName = APP_PATH + "Facilities.csv";
    string[] Lines = File.ReadAllLines(CSVFilePathName);
    string[] Fields;
    Fields = Lines[0].Split(new char[] { ',' });
    int Cols = Fields.GetLength(0);
    DataTable dt = new DataTable();
    //1st row must be column names; force lower case to ensure matching later on.
    for (int i = 0; i < Cols-1; i++)
            dt.Columns.Add(Fields[i].ToLower(), typeof(string));
    DataRow Row;
    for (int i = 0; i < Lines.GetLength(0)-1; i++)
    {
            Fields = Lines[i].Split(new char[] { ',' });
            Row = dt.NewRow();
            for (int f = 0; f < Cols-1; f++)
                    Row[f] = Fields[f];
            dt.Rows.Add(Row);
    }
    
    0 讨论(0)
  • 2020-11-22 05:49

    Here's a solution that uses ADO.Net's ODBC text driver:

    Dim csvFileFolder As String = "C:\YourFileFolder"
    Dim csvFileName As String = "YourFile.csv"
    
    'Note that the folder is specified in the connection string,
    'not the file. That's specified in the SELECT query, later.
    Dim connString As String = "Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=" _
        & csvFileFolder & ";Extended Properties=""Text;HDR=No;FMT=Delimited"""
    Dim conn As New Odbc.OdbcConnection(connString)
    
    'Open a data adapter, specifying the file name to load
    Dim da As New Odbc.OdbcDataAdapter("SELECT * FROM [" & csvFileName & "]", conn)
    'Then fill a data table, which can be bound to a grid
    Dim dt As New DataTableda.Fill(dt)
    
    grdCSVData.DataSource = dt
    

    Once filled, you can value properties of the datatable, like ColumnName, to make utilize all the powers of the ADO.Net data objects.

    In VS2008 you can use Linq to achieve the same effect.

    NOTE: This may be a duplicate of this SO question.

    0 讨论(0)
  • 2020-11-22 05:50

    With Cinchoo ETL - an open source library, you can easily convert CSV file to DataTable with few lines of code.

    using (var p = new ChoCSVReader(** YOUR CSV FILE **)
         .WithFirstLineHeader()
        )
    {
        var dt = p.AsDataTable();
    }
    

    For more information, please visit codeproject article.

    Hope it helps.

    0 讨论(0)
  • I have decided to use Sebastien Lorion's Csv Reader.

    Jay Riggs suggestion is a great solution also, but I just didn't need all of the features that that Andrew Rissing's Generic Parser provides.

    UPDATE 10/25/2010

    After using Sebastien Lorion's Csv Reader in my project for nearly a year and a half, I have found that it throws exceptions when parsing some csv files that I believe to be well formed.

    So, I did switch to Andrew Rissing's Generic Parser and it seems to be doing much better.

    UPDATE 9/22/2014

    These days, I mostly use this extension method to read delimited text:

    https://github.com/Core-Techs/Common/blob/master/CoreTechs.Common/Text/DelimitedTextExtensions.cs#L22

    https://www.nuget.org/packages/CoreTechs.Common/

    UPDATE 2/20/2015

    Example:

    var csv = @"Name, Age
    Ronnie, 30
    Mark, 40
    Ace, 50";
    
    TextReader reader = new StringReader(csv);
    var table = new DataTable();
    using(var it = reader.ReadCsvWithHeader().GetEnumerator())
    {
    
        if (!it.MoveNext()) return;
    
        foreach (var k in it.Current.Keys)
            table.Columns.Add(k);
    
        do
        {
            var row = table.NewRow();
            foreach (var k in it.Current.Keys)
                row[k] = it.Current[k];
        
            table.Rows.Add(row);
        
        } while (it.MoveNext());
    }
    
    0 讨论(0)
  • 2020-11-22 05:56

    Hey its working 100%

      public static DataTable ConvertCSVtoDataTable(string strFilePath)
      {
        DataTable dt = new DataTable();
        using (StreamReader sr = new StreamReader(strFilePath))
        {
            string[] headers = sr.ReadLine().Split(',');
            foreach (string header in headers)
            {
                dt.Columns.Add(header);
            }
            while (!sr.EndOfStream)
            {
                string[] rows = sr.ReadLine().Split(',');
                DataRow dr = dt.NewRow();
                for (int i = 0; i < headers.Length; i++)
                {
                    dr[i] = rows[i];
                }
                dt.Rows.Add(dr);
            }
    
        }
    
    
        return dt;
       }
    

    CSV Image enter image description here

    Data table Imported enter image description here

    0 讨论(0)
提交回复
热议问题