【问题标题】:How can I retrieve data from multiple objects from a .csv file using CsvHelper?如何使用 CsvHelper 从 .csv 文件中的多个对象中检索数据?
【发布时间】:2020-04-10 08:40:37
【问题描述】:

我有一个 MyClass 类型的列表,MyClass 有几个属性。 如果 .csv 文件看起来像这样,我如何使用 CsvHelper 检索数据? (是的,Data1 类型的属性已编号。)

日期 |数据1 |单位 |数据2 |单位 |数据3 |单位 | ... |数据N |单元 ------------|---------|--------|----------|--------| ----------|-------|------|----------|---------- 2020.01.02 | 1 |千瓦| 3 |千瓦| 1.5 |千瓦| ... | 0 |千瓦 2020.01.03 | 0 |千瓦| 4 |千瓦| 1 |千瓦| ... | 3 |千瓦 2020.01.04 | 4 |千瓦| 2 |千瓦| 1 |千瓦| ... | 2 |千瓦

这是我想看到的。对象存储在一个可以存储 MyClass 类型的列表中。

List(MyClass) = [Object-1, Object-1, Object-3, ..., Object-N]

Object-1: [(2020.01.02.,1, kW),(2020.01.03.,0, kW),,(2020.01.04.,4, kW)]
Object-2: [(2020.01.02.,3, kW),(2020.01.03.,4, kW),,(2020.01.04.,2, kW)]
Object-3: [(2020.01.02.,1.5, kW),(2020.01.03.,1, kW),,(2020.01.04.,1, kW)]
...
Object-N: [(2020.01.02.,0, kW),(2020.01.03.,3, kW),,(2020.01.04.,2, kW)]



    MappedClass{
        private DateTime Date;
        private List List;
    }



    MyClass{
        private DateTime Date;
        private string A1; //Attribute1
        private int A2; //Attribute2
    }

如果只列出一个对象的属性,那么我可以执行任务,但不能使用多个对象和此布局。 我想逐行读取文件,然后以某种方式配对其相关数据。

如何有效地完成这项任务?

【问题讨论】:

  • 嗨@Krsztn_,欢迎来到 Stackoverflow!您能否编辑您的问题以包含 CSV 文件中的几行?从你的问题来看,我不太清楚你的 CSV 是什么样的。还有,MappedClass是什么,你想怎么用?

标签: csv .net-core mapping csvhelper


【解决方案1】:

这是一种方法。

public class Program
{
    public static void Main(string[] args)
    {
        using (MemoryStream stream = new MemoryStream())
        using (StreamWriter writer = new StreamWriter(stream))
        using (StreamReader reader = new StreamReader(stream))
        using (CsvReader csv = new CsvReader(reader, CultureInfo.InvariantCulture))
        {
            writer.WriteLine("Date,Data1,Unit,Data2,Unit,Data3,Unit");
            writer.WriteLine("2020.01.02,1,kw,3,kw,1.5,kw");
            writer.WriteLine("2020.01.03,0,kw,4,kw,1,kw");
            writer.Flush();
            stream.Position = 0;

            var records = new List<MappedClass>();

            csv.Read();
            csv.ReadHeader();

            while (csv.Read())
            {
                var record = new MappedClass
                {
                    Date = record.Date,
                    Date = csv.GetField<DateTime>(0),
                    List = new List<MyClass>()
                };

                for (int i = 1; i < csv.Context.HeaderRecord.Length; i += 2)
                {
                    var item = new MyClass
                    {
                        Data = csv.GetField<decimal>(i),
                        Unit = csv.GetField<string>(i + 1)
                    };

                    record.List.Add(item);
                }

                records.Add(record);
            }
        }
    }
}

public class MappedClass
{
    public DateTime Date { get; set; }
    public List<MyClass> List { get; set; }
}

public class MyClass {
    public DateTime Date;
    public string Unit; //Attribute1
    public decimal Data; //Attribute2
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    相关资源
    最近更新 更多