Skip to main content
 首页 » 编程设计

c#之如何使用 CSV Helper 映射集合

2024年02月05日33think

public class Template : Entity 
{ 
    public Template() 
    { 
        TemplateItems = new List<TemplateItem>(); 
    } 
 
    public int id { get; set; } 
    public string name { get; set; } 
    public virtual ICollection<TemplateItem> TemplateItems { get; set; } 
} 
 
 
public class TemplateItem : Entity 
{ 
    public int id { get; set; } 
    public int templateId { get; set; } 
    public string name { get; set; } 
    public virtual Template Template { get; set; } 
} 
 
 
public sealed class TemplateMap : CsvClassMap<Template> 
{ 
    public TemplateMap() 
    { 
        Map(m => m.name).Name("name"); 
        //Map(m => m.TemplateItems).ConvertUsing(row => new List<string> { row("nodeType") }); 
 
        // How to map a collection value to csv column  
    } 
} 

我正在读取 CSV 文件,需要将 csv 列映射到两个不同的表 我有两种不同的 table 模型 即模板和模板项 模板项是从模板映射的 如何映射 csv 类?

请您参考如下方法:

目前这是不可能的。您需要手动处理集合。如果您想将所有内容保存在映射文件中,一种方法是使用 ConvertUsing。

这是一个例子:

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("1,a,b,c"); 
        writer.WriteLine("2,d,e,f"); 
        writer.Flush(); 
        stream.Position = 0; 
 
        csv.Configuration.HasHeaderRecord = false; 
        csv.Configuration.RegisterClassMap<TestMap>(); 
        csv.GetRecords<Test>().Dump(); 
    } 
} 
 
public class Test 
{ 
    public int Id { get; set; } 
    public List<string> Names { get; set; }  
} 
 
public class TestMap : CsvClassMap<Test> 
{ 
    public TestMap() 
    { 
        Map(m => m.Id); 
        Map(m => m.Names).ConvertUsing(row => 
        { 
            var list = new List<string>(); 
            list.Add(row.GetField( 1 )); 
            list.Add(row.GetField( 2 )); 
            list.Add(row.GetField( 3 )); 
            return list; 
        }); 
    } 
}