【问题标题】:Reading different CSV with CSVHelper使用 CSVHelper 读取不同的 CSV
【发布时间】:2016-05-13 19:14:21
【问题描述】:

基本上我要做的是使用 CSVHelper 读取 CSV 文件。诀窍在于有多个文件(每次用户选择不同的文件)并且每个文件都有不同的结构

他们唯一共享的是第一个名为“Id”的列,然后他们每个人都有不同数量的列(从 2 个到 5 个)具有不同的数据类型。

我试图这样做:

public class Country
{
    public int Id { get; set; }
    public IList<string> Attributes { get; set; }
}

public sealed class CountryMap : CsvClassMap<Country>
{
    private List<string> attributeColumns = 
        new List<string> { "Attribute1", "Attribute2", "Attribute3", "Attribute4", "Attribute5" };

    public override void CreateMap()
    {
        Map(m => m.Id).Name("Id").Index(0);
        Map(m => m.Attributes).ConvertUsing(row =>
            attributeColumns
                .Select(column => row.GetField<string>(column))
                .Where(value => String.IsNullOrWhiteSpace(value) == false)
            );
    }
}

然后用:

using (var reader = new CsvReader(new StreamReader(FilePath,encoding.UTF8)))
{
    reader.Configuration.RegisterClassMap<CountryMap>();
    while (reader.Read())
    {
        var card = reader.GetRecord<Country>();
    }
}

但只有我得到的是 car = null。

我将非常感谢任何提示和答案。

【问题讨论】:

  • 在以下网页上使用我的 CSVReader 类:stackoverflow.com/questions/30129406/…。结果被放入数据表中。您可以多次调用该类并将第二个结果放在不同的 DataTable 中。使用连接来合并两个数据表。

标签: c# csv csvhelper


【解决方案1】:

一种不同的方法是简单地使用 .Net OleDB 提供的为您创建一个 CSV 文件形式的 DataTable。由于 DataTable 已经包含必要的模式数据,它应该简化文件列到内部类的映射。

    using System.Data;
    using System.Data.OleDb;
    using System.IO;

    namespace App.Data
    {
        public class CsvFileHelper
        {
            public static DataTable ReadAsDataTable(string fileFullName)
            {
                DataTable tableCSV;

                using (OleDbConnection connection = new OleDbConnection("Provider=Microsoft.Jet.OleDb.4.0; Data Source = " + Path.GetDirectoryName(fileFullName) + "; Extended Properties = \"Text;HDR=YES;FMT=Delimited\""))
                {
                    connection.Open();

                    using (OleDbDataAdapter adapter = new OleDbDataAdapter("SELECT * FROM " + Path.GetFileName(fileFullName), connection))
                    {
                        DataSet ds = new DataSet("CSVDataSet");
                        adapter.Fill(ds);

                        tableCSV = ds.Tables[0];
                    }
                }

                return tableCSV;
            }
        }
    }

【讨论】:

  • 谢谢,这正是我想要的。我不知道这一点,因为我刚开始使用 C#。
猜你喜欢
  • 2021-10-02
  • 2021-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-09-20
相关资源
最近更新 更多