Csvhelper: рдСрдЯреЛ рдореИрдкрд┐рдВрдЧ рдкрд░ рд▓рд╛рдкрддрд╛ рдлрд╝реАрд▓реНрдб рдХреЛ рдХреИрд╕реЗ рдкреНрд░рдмрдВрдзрд┐рдд рдХрд░реЗрдВ

рдХреЛ рдирд┐рд░реНрдорд┐рдд 19 рдорд╛рд░реНрдЪ 2019  ┬╖  5рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ  ┬╖  рд╕реНрд░реЛрдд: JoshClose/CsvHelper

рд╕реАрд╡реАрдПрд╕ рдлрд╝рд╛рдЗрд▓:

рджрд╛рдпрд░ рдП, рдлреАрд▓реНрдб рдмреА, рдлреАрд▓реНрдб рд╕реА

1, "рдП", 3

рдПрдХ рдХрдХреНрд╖рд╛
{
рдлрд╝реАрд▓реНрдб рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
рд╕реНрдЯреНрд░рд┐рдВрдЧ jsonvalues;
}

рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ,
рдХреНрд▓рд╛рд╕ рдП = рдЧреЗрдЯрд░рд┐рдХреЙрд░реНрдб()
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рд┐рдП:
рдП.рдлрд╝реАрд▓реНрдбрдП=1
a.jsonvalues={"fieldB":"a",,"fieldC":"3"}

рдХреИрд╕реЗ рдХрд░реЗрдВ?

рд╕рднреА 5 рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

рдПрдХ рдЯрд╛рдЗрдк рдХрдирд╡рд░реНрдЯрд░ рдпрд╣рд╛рдВ рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ рдХреНрдпреЛрдВрдХрд┐ рд╡реЗ рдкреНрд░рддреНрдпреЗрдХ рдорд╛рди рдХреЛ рдлрд┐рд░ рд╕реЗ рдЪрд▓рд╛рддреЗ рд╣реИрдВред рдЖрдк рдЗрд╕реЗ рдореЙрдбрд▓ рдореЗрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ:

рдПрдХ рдХрдХреНрд╖рд╛ {
рдлреАрд▓реНрдбрдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреАрд▓реНрдбрдмреА;
рд╕реНрдЯреНрд░рд┐рдВрдЧ рдлреАрд▓реНрдбрд╕реА;
[рдзреНрдпрд╛рди рди рджреЗрдирд╛]
рд╕реНрдЯреНрд░рд┐рдВрдЧ jsonvalues тАЛтАЛ{рдкреНрд░рд╛рдкреНрдд рдХрд░реЗрдВ => рдирдпрд╛ {рдлрд╝реАрд▓реНрдбрдмреА = рдлрд╝реАрд▓реНрдбрдмреА, рдлрд╝реАрд▓реНрдбрд╕реА = рдлрд╝реАрд▓реНрдбрд╕реА}; };
}

рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдХреЙрд▓рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯрд░ рд╣реИред

рдореВрд▓ рд░реВрдк рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рдХреЛ рдПрдХ рдХреЙрд▓рдо рдХреЗ рд░реВрдк рдореЗрдВ рдЖрдпрд╛рдд рдХрд░рдирд╛, рд▓реЗрдХрд┐рди рдлрд┐рд░ рдЙрдиреНрд╣реЗрдВ рд╕рдВрдпреЛрдЬрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдЧреЗрдЯрд░ рд╣реИред

рд╢реБрдХреНрд░рд┐рдпрд╛ред рдпрд╣ рдПрдХ рд╕реАрдзрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИ, рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рдореИрдкрд┐рдВрдЧ рдирд╣реАрдВуАВ
рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП,
рд╕реАрд╡реАрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдП:
рджрд╛рдпрд░ рдП, рдлреАрд▓реНрдб рдмреА, рдлреАрд▓реНрдб рд╕реА
1, "рдП", 3
рд╕реАрд╡реАрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдмреА:
рджрд╛рдпрд░ рдП, рдлреАрд▓реНрдб рдмреА, рдлреАрд▓реНрдб рдбреА, рдлреАрд▓реНрдб рдИ
2,"рдП",2019/02/01,"рдЯреЙрдо"
рдПрдХ рдХрдХреНрд╖рд╛
{
рдлрд╝реАрд▓реНрдб рдП рдЯрд╛рдЗрдк рдХрд░реЗрдВ;
рд╕реНрдЯреНрд░рд┐рдВрдЧ jsonvalues;
}

рдореЗрд░реЗ рдХреЛрдб рдореЗрдВ,
рдХреНрд▓рд╛рд╕ рдП = GetRecord () // рд╕реАрд╡реАрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдП рд╕реЗ
ClassA b=GetRecord ()// рд╕реАрд╡реАрдПрд╕ рдлрд╝рд╛рдЗрд▓ рдмреА рд╕реЗ
рдореБрдЭреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдгрд╛рдо рдЪрд╛рд╣рд┐рдП:
рдП.рдлрд╝реАрд▓реНрдбрдП=1
a.jsonvalues={"fieldB":"a",,"fieldC":"3"}
рдЦ.рдлрд╝реАрд▓реНрдбрдП=2
b.jsonvalues={"fieldB":"a",,"fieldD":"2019/02/01",,"FieldE":"tom"}

рдХреИрд╕реЗ рдХрд░реЗрдВ?

void Main()
{
    var s = new StringBuilder();
    s.AppendLine("FieldA,FieldB,FieldC");
    s.AppendLine("1,\"a\",3");
    using (var reader = new StringReader(s.ToString()))
    using (var csv = new CsvReader(reader))
    {       
        csv.Configuration.RegisterClassMap<ClassAMap>();
        csv.Configuration.RegisterClassMap<JsonDataMap>();
        csv.GetRecords<ClassA>().ToList().Dump();
    }
}

public class ClassA
{
    public int FieldA { get; set; }
    public string Json { get; set; }
}

public class ClassAMap : ClassMap<ClassA>
{
    public ClassAMap()
    {
        Map(m => m.FieldA);
        Map(m => m.Json).ConvertUsing(row =>
        {
            var jsonData = row.GetRecord<JsonData>();
            return JsonConvert.SerializeObject(jsonData);
        });
    }
}

public class JsonData
{
    public string FieldB { get; set; }
    public int FieldC { get; set; }
}

public class JsonDataMap : ClassMap<JsonData>
{
    public JsonDataMap()
    {
        Map(m => m.FieldB);
        Map(m => m.FieldC);
    }
}

рдзрдиреНрдпрд╡рд╛рдж: рдЬреЛрд╢ рдХреНрд▓реЛрдЬ, рдкрд╛рдпрдиреЗрдЬред
рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╡рд╣ рд╣реИ рдЬреЛ рдореИрдВ рдЪрд╛рд╣рддрд╛ рд╣реВрдВред

static void Main(string[] args)
{
    var s = new StringBuilder();
    s.AppendLine("FieldA,FieldB,FieldC");
    s.AppendLine("1,\"a\",3");
    using (var reader = new StringReader(s.ToString()))
    using (var csv = new CsvReader(reader))
    {
          csv.Configuration.RegisterClassMap<ClassAMap>();
          csv.GetRecords<ClassA>().ToList();
    }
}

public class ClassA
{
    public int FieldA { get; set; }
    public string Json { get; set; }
}

public class ClassAMap : ClassMap<ClassA>
{
     public ClassAMap()
     {
          Map(m => m.FieldA);
          Map(m => m.Json).ConvertUsing(row =>
          {
                Dictionary<string, string> records =  new Dictionary<string, string>();
                List<string> fieldHeaderList = new List<string>(row.Context.HeaderRecord);
                fieldHeaderList.Remove("FieldA");
                foreach (string field in fieldHeaderList)
                {
                    records.Add(field, row.GetField(field));
                }
                return JsonConvert.SerializeObject(records);
          });
     }
} 
рдХреНрдпрд╛ рдпрд╣ рдкреГрд╖реНрда рдЙрдкрдпреЛрдЧреА рдерд╛?
0 / 5 - 0 рд░реЗрдЯрд┐рдВрдЧреНрд╕

рд╕рдВрдмрдВрдзрд┐рдд рдореБрджреНрджреЛрдВ

CallMeBruce picture CallMeBruce  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

DmitryEfimenko picture DmitryEfimenko  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

JoshClose picture JoshClose  ┬╖  4рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

shinriyo picture shinriyo  ┬╖  6рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ

dsotiriades picture dsotiriades  ┬╖  3рдЯрд┐рдкреНрдкрдгрд┐рдпрд╛рдБ