将 CSV 文件读取到嵌套 objects
Read CSV file to nested objects
我有像这样的 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 文件读入以下 class 层次结构:
(我想以 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 转储):
PS。我更改了属性的名称,因为编译器不允许它们完全按照 class 命名。
class Column
{
public string Column_ { get; set; }
public List<Value> Values { get; set; }
}
class Value
{
public string Value_ { get; set; }
}
我有像这样的 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 文件读入以下 class 层次结构:
(我想以 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 转储):
PS。我更改了属性的名称,因为编译器不允许它们完全按照 class 命名。
class Column
{
public string Column_ { get; set; }
public List<Value> Values { get; set; }
}
class Value
{
public string Value_ { get; set; }
}