CSV帮助程序多个相同列名称

时间:2017-10-04 08:25:53

标签: csv mapping csvhelper

我的CSV文件具有多个具有相同标题名称的列。我正在使用CsvHelper库。 我想将他们的行值收集到一个List中,但我收集的第一行值多次我指定了标题而没有从另一个索引位置收集。 恩。栏目栏目     Test1 Test2     Test3 Test4 我希望我的列表首先有两个元素,值为Test1,Test2,第二个元素的值为Test3,Test4,但我的第一行有值Test1,Test1和第二个Test3,Test3。

这是此列的映射

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,这可以工作,但这不是我的问题的解决方案。

1 个答案:

答案 0 :(得分:1)

有很多方法可以做到这一点。这是一个例子。

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");