当前位置:  开发笔记 > 编程语言 > 正文

如何将CSV文件读入.NET Datatable

如何解决《如何将CSV文件读入.NETDatatable》经验,为你挑选了7个好方法。

如何将CSV文件加载到a中System.Data.DataTable,根据CSV文件创建数据表?

常规的ADO.net功能是否允许这样做?



1> Jim Scott..:

我一直在使用OleDb提供商.但是,如果您正在读取具有数值但是希望将它们视为文本的行,则会出现问题.但是,您可以通过创建schema.ini文件来解决该问题.这是我使用的方法:

// using System.Data;
// using System.Data.OleDb;
// using System.Globalization;
// using System.IO;

static DataTable GetDataTableFromCsv(string path, bool isFirstRowHeader)
{
    string header = isFirstRowHeader ? "Yes" : "No";

    string pathOnly = Path.GetDirectoryName(path);
    string fileName = Path.GetFileName(path);

    string sql = @"SELECT * FROM [" + fileName + "]";

    using(OleDbConnection connection = new OleDbConnection(
              @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + pathOnly + 
              ";Extended Properties=\"Text;HDR=" + header + "\""))
    using(OleDbCommand command = new OleDbCommand(sql, connection))
    using(OleDbDataAdapter adapter = new OleDbDataAdapter(command))
    {
        DataTable dataTable = new DataTable();
        dataTable.Locale = CultureInfo.CurrentCulture;
        adapter.Fill(dataTable);
        return dataTable;
    }
}


虽然这个答案会奏效,但我强烈建议不要这样做.您引入了一个外部依赖项,它可能与同一台计算机上的其他办公室安装冲突(在本地开发环境中使用Excel?),具体取决于安装的版本.有一些NuGet包(ExcelDataReader,CsvHelper)以更高效,更便携的方式完成这项工作.

2> Jay Riggs..:

这是一个优秀的类,它将使用数据结构将CSV数据复制到数据表中以创建DataTable:

适用于平面文件的便携式高效通用解析器

它易于配置且易于使用.我劝你看看.



3> Ronnie Overb..:

我决定使用Sebastien Lorion的Csv Reader.

Jay Riggs的建议也是一个很好的解决方案,但我并不需要Andrew Rissing的Generic Parser提供的所有功能.

更新10/25/2010

在我的项目中使用Sebastien Lorion的Csv Reader近一年半之后,我发现它在解析一些我认为形成良好的csv文件时会抛出异常.

所以,我确实切换到了Andrew Rissing的Generic Parser,它似乎做得更好.

更新2014年9月22日

这些天,我主要使用这种扩展方法来读取分隔文本:

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

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

2015年2月20日更新

例:

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



4> Shivam Sriva..:

嘿它的工作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图片 在此输入图像描述

数据表已导入 在此输入图像描述


仅当100%的输入是最简单的CSV文件时(在您的情况下可能是这样).

5> Chuck Bevitt..:

我们总是习惯使用Jet.OLEDB驱动程序,直到我们开始使用64位应用程序.微软没有也不会发布64位Jet驱动程序.这是我们提出的一个简单的解决方案,它使用File.ReadAllLines和String.Split来读取和解析CSV文件并手动加载DataTable.如上所述,它不处理其中一个列值包含逗号的情况.我们主要使用它来读取自定义配置文件 - 使用CSV文件的好处是我们可以在Excel中编辑它们.

string CSVFilePathName = @"C:\test.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; i++)
    dt.Columns.Add(Fields[i].ToLower(), typeof(string));
DataRow Row;
for (int i = 1; i < Lines.GetLength(0); i++)
{
    Fields = Lines[i].Split(new char[] { ',' });
    Row = dt.NewRow();
    for (int f = 0; f < Cols; f++)
        Row[f] = Fields[f];
    dt.Rows.Add(Row);
}



6> Thomas..:

这是我使用它的代码,但您的应用程序必须使用网络版3.5运行

private void txtRead_Click(object sender, EventArgs e)
        {
           // var filename = @"d:\shiptest.txt";

            openFileDialog1.InitialDirectory = "d:\\";
            openFileDialog1.Filter = "txt files (*.txt)|*.txt|All files (*.*)|*.*";
            DialogResult result = openFileDialog1.ShowDialog();
            if (result == DialogResult.OK)
            {
                if (openFileDialog1.FileName != "")
                {
                    var reader = ReadAsLines(openFileDialog1.FileName);

                    var data = new DataTable();

                    //this assume the first record is filled with the column names
                    var headers = reader.First().Split(',');
                    foreach (var header in headers)
                    {
                        data.Columns.Add(header);
                    }

                    var records = reader.Skip(1);
                    foreach (var record in records)
                    {
                        data.Rows.Add(record.Split(','));
                    }

                    dgList.DataSource = data;
                }
            }
        }

        static IEnumerable ReadAsLines(string filename)
        {
            using (StreamReader reader = new StreamReader(filename))
                while (!reader.EndOfStream)
                    yield return reader.ReadLine();
        }



7> kombsh..:

你可以通过在C#中使用Microsoft.VisualBasic.FileIO.TextFieldParser dll来实现它.

static void Main()
        {
            string csv_file_path=@"C:\Users\Administrator\Desktop\test.csv";

            DataTable csvData = GetDataTabletFromCSVFile(csv_file_path);

            Console.WriteLine("Rows count:" + csvData.Rows.Count);

            Console.ReadLine();
        }


private static DataTable GetDataTabletFromCSVFile(string csv_file_path)
        {
            DataTable csvData = new DataTable();

            try
            {

            using(TextFieldParser csvReader = new TextFieldParser(csv_file_path))
                {
                    csvReader.SetDelimiters(new string[] { "," });
                    csvReader.HasFieldsEnclosedInQuotes = true;
                    string[] colFields = csvReader.ReadFields();
                    foreach (string column in colFields)
                    {
                        DataColumn datecolumn = new DataColumn(column);
                        datecolumn.AllowDBNull = true;
                        csvData.Columns.Add(datecolumn);
                    }

                    while (!csvReader.EndOfData)
                    {
                        string[] fieldData = csvReader.ReadFields();
                        //Making empty value as null
                        for (int i = 0; i < fieldData.Length; i++)
                        {
                            if (fieldData[i] == "")
                            {
                                fieldData[i] = null;
                            }
                        }
                        csvData.Rows.Add(fieldData);
                    }
                }
            }
            catch (Exception ex)
            {
            }
            return csvData;
        }

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有