c# - 将 CSV 文件读取到嵌套对象

标签 c# linq csv group-by csvhelper

我有 CSV 文件,例如

Title|Column|Value
A|Z1|1
A|Z1|2
A|Z1|3
A|Z2|1
A|Z2|5
B|Z3|4
B|Z3|6
....

我想将此 csv 文件读入以下类层次结构中: (我想最终得到一个 MyClass 列表)

class MyClass
{
    public string Title { get; set; }
    public List<Column> Columns { get; set; }
}
class Column
{
    public string Column { get; set; }
    public List<Value> Values { get; set; }
}
class Value
{
    public string Value { get; set; }
}

我无法理解如何实现这一目标。 到目前为止我尝试过的是:

class DTO
{
    public string Title { get; set; }
    public string Column { get; set; }
    public string Value { get; set; }
}

List<DTO> records = new List<DTO>();
using (var reader = new StreamReader(model.Path))
using (var csv = new CsvReader(reader))
{
    records = csv.GetRecords<DTO>().ToList();
}

var temp = records
    .GroupBy(x => x.Title)
    .Select(y => new
    {
        Title = y.Key,
        Columns = y.SelectMany(x => new { x.Column, x.Value }) //I am not sure how to proceed from here
    });

我面临的问题是如何进一步对列进行分组并获取值,或者我是否应该使用其他方法?

有关 csv 结构的更多说明: 每列可以有多个值,每个标题可以有多个列。

最佳答案

There can be multiple Values for each column, and there can be multiple columns for each Title.

这意味着您必须重复第一步并按列再次GroupBy。您还应该使用已经为此实现的类型。不要使用匿名类型:

IEnumerable<MyClass> temp = records
    .GroupBy(x => x.Title)
    .Select(y => new MyClass
    {
        Title = y.Key,
        Columns = y.GroupBy(x => x.Column)
        .Select( c => new Column
        {
            Column_ = c.Key,
            Values = c.Select(v => new Value
            {
                Value_ = v.Value
            }).ToList()
        }).ToList()
    });

    temp.Dump();

结果(来自 LINQPad 转储):

enter image description here

PS。我更改了属性的名称,因为编译器不允许将它们完全按照类的名称命名。

class Column
{
    public string Column_ { get; set; }
    public List<Value> Values { get; set; }
}
class Value
{
    public string Value_ { get; set; }
}

关于c# - 将 CSV 文件读取到嵌套对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56731554/

相关文章:

c# - 如何在序列中的linq中获取元素范围?

python - 使用 DictReader() 时出现 KeyError

csv - 在 Go 中高效读写 CSV

c# - 文件传输协议(protocol)和 AS400

c# - 如何防止向 SQL Server 表中插入重复数据?

c# - 如何在 OpenXML/PresentationML/C# 中的 PowerPoint (PPTX) 中插入换行符

c# - LINQ 查询以在与通用列表不同的列表之间进行选择

c# - 比较数组或其他方法

excel - 使用 Perl 生成的 csv 文件已损坏

c# - 将实体保存到数据库——我的 Save 方法应该返回保存的实体吗?