Запись файла CSV - добавление префикса к именам столбцов - PullRequest
0 голосов
/ 18 мая 2019

Запись коллекции в CSV-файл. Я хочу добавить значение свойства в качестве префикса к именам столбцов. Есть ли способ настроить маппер для записи имен столбцов со значением свойства, как у нас в следующем примере.

CSV-файл

Свойство, Id, 123_Property1, 123_Property2, Id, 456_Property1, 456_Property2

Заголовок, 123, Джон, Смит, 456, Хелен, Томсон

public class MyClass
    {
      public string Property {get; set;}
      public List<MyCustom> MyCustoms {get; set;}
    }

   public class MyCustom 
        {
           public string Id {get; set;}
           public string Property2 {get; set;}
           public string Property3 {get; set;}
         }

 public class MyClassMap : ClassMap<MyClass>
 {
   public MyClassMap(){
   this.Map(m => m.Property).Name("Property"); 
(?)this.Map(m => m.MyCustoms).Name("IdVALUE ...");
  }

1 Ответ

0 голосов
/ 20 мая 2019

То, что вы хотите сделать, может быть сделано, но оно делает некоторые предположения и может быть легко нарушено.В конечном итоге вы должны переосмыслить свою структуру CSV.Это решение вручную записывает запись заголовка и использует пользовательский TypeConverter для распечатки каждого MyCustom класса.

Допущения

  • Каждый MyClass будет иметь одинаковое число MyCustom, и идентификаторы будут совпадать между каждой MyClass записью.
  • Идентификаторы MyCustom будут распечатываться в одном и том же порядке каждый раз. (Обновление: добавлено OrderBy для решения этой проблемы.)
public static void Main(string[] args)
{    
    var records = new List<MyClass> {
        new MyClass {
            Property = "Title",
            MyCustoms = new List<MyCustom> {
                new MyCustom { Id = "123", Property1 = "John", Property2 = "Smith" },
                new MyCustom { Id = "456", Property1 = "Helen", Property2 = "Thomson"}
            }
        },
        new MyClass {
            Property = "AnotherProperty",
            MyCustoms = new List<MyCustom> {
                new MyCustom { Id = "123", Property1 = "Another11", Property2 = "Another12" },
                new MyCustom { Id = "456", Property1 = "Another21", Property2 = "Another22"}
            }
        }
    };

    using (var csv = new CsvWriter(Console.Out))
    {
        csv.Configuration.TypeConverterCache.AddConverter<List<MyCustom>>(new MyTypeConverter());
        csv.Configuration.HasHeaderRecord = false;

        // Get all of the ids from the first record.
        var ids = records[0].MyCustoms.OrderBy(m => m.Id).Select(m => m.Id).ToList();

        csv.WriteField("Property");

        foreach (var id in ids)
        {
            csv.WriteField("Id");
            csv.WriteField($"{id}_Property1");
            csv.WriteField($"{id}_Property2");
        }

        csv.NextRecord();

        csv.WriteRecords(records);                
    }

    Console.ReadKey();
}


public class MyClass
{
    public string Property { get; set; }
    public List<MyCustom> MyCustoms {get;set;}
}

public class MyCustom
{
    public string Id { get; set; }
    public string Property1 { get; set; }
    public string Property2 { get; set; }
}

private class MyTypeConverter : DefaultTypeConverter
{
    public override string ConvertToString(object value, IWriterRow row, MemberMapData memberMapData)
    {
        var list = ((List<MyCustom>)value).OrderBy(m => m.Id).ToList();

        foreach (var item in list)
        {
            row.WriteField(item.Id);
            row.WriteField(item.Property1);
            row.WriteField(item.Property2);
        }

        return null;
    }
}
...