为了账号安全,请及时绑定邮箱和手机立即绑定

如何将CSV文件读入.NET Datatable

/ 猿问

如何将CSV文件读入.NET Datatable

C#
精慕HU 2019-10-12 11:07:49

如何将CSV文件读入.NET Datatable

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

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


查看完整描述

3 回答

?
123456qqq

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

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

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


查看完整回答
反对 回复 2019-10-13
?
慕田峪4524236

我一直在使用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;
    }}



查看完整回答
反对 回复 2019-10-13
?
莫回无

我决定使用Sebastien Lorion的Csv Reader。

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

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

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

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

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

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

例:

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



查看完整回答
反对 回复 2019-10-13

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信