CSV助手多个相同的列名称
问题描述:
我有具有相同头名称的多个列的CSV文件。我正在使用CsvHelper库。 我想收集他们的行值到一个列表中,但我收集第一行值多次我指定标题,而不是从另一个索引位置收集。 ex。 COLUMN COLUMN Test1 Test2 Test3 Test4 我期望我的列表首先有两个元素,值为Test1,Test2,第二个值为Test3,Test4,但是第一行的值为Test1,Test1和Test3,Test3。CSV助手多个相同的列名称
这是可以这样用映射来完成此列
Map(m => m.COLUMN).ConvertUsing(row =>
(row as CsvReader)?.FieldHeaders
.Where(header => header.StartsWith("COLUMN"))
.Select(header => row.GetField<string>(header))
.Where(value => !string.IsNullOrWhiteSpace(value))
.ToList()
);
映射? 如果我将列名更改为COLUMN1和COLUMN2,这可行,但这不是我的问题的解决方案。
答
有很多方法可以做到这一点。这是一个例子。
void Main()
{
using (var stream = new MemoryStream())
using (var writer = new StreamWriter(stream))
using (var reader = new StreamReader(stream))
using (var csv = new CsvReader(reader))
{
writer.WriteLine("Id,Name,List,List,List");
writer.WriteLine("1,one,a,b,c");
writer.WriteLine("1,two,d,e,f");
writer.Flush();
stream.Position = 0;
csv.Configuration.RegisterClassMap<TestMap>();
csv.GetRecords<Test>().Dump();
}
}
public class Test
{
public int Id { get; set; }
public string Name { get; set; }
public List<string> List { get; set; }
}
public sealed class TestMap : CsvClassMap<Test>
{
public TestMap()
{
Map(m => m.Id);
Map(m => m.Name);
Map(m => m.List).ConvertUsing(row =>
{
var list = new List<string>();
list.Add(row.GetField("List", 0));
list.Add(row.GetField("List", 1));
list.Add(row.GetField("List", 2));
return list;
});
}
}
此外,第3版具有映射到内置的可枚举。
Map(m => m.List).Name("List");
+0
谢谢乔希,信息是非常有用的解决我的问题。 – user3690217
的Test1和Test2的值是第一行和Test3的和TEST4在第二 – user3690217