CsvHelper escribiendo el encabezado a partir de dos tipos con orden mixto.
Estoy escribiendo propiedades de dos clases en un archivo CSV usando CsvHelper. Tengo mapas para ambas clases. El problema es que quiero que las cabeceras/campos estén en el siguiente orden:
csv
filename, FooId, BarId, FooName, BarName
file.txt, f1, b1, myFoo, myBar
Pero actualmente aparece en el siguiente orden:
csv
filename, FooId, FooName, BarId, BarName
file.txt, f1, myFoo, b1, myBar
Aquí tienes un código relevante:
public class Foo {
public string Filename { get; set; }
public string Id { get; set; }
public string Name { get; set; }
}
public class FooMap : ClassMap<foo> {
public FooMap() {
Map(m => m.Filename).Index(0).Name("filename");
Map(m => m.Id).Index(1).Name("FooId");
Map(m => m.Name).Index(3).Name("FooName");
}
}
public class Bar {
public string Id { get; set; }
public string Name { get; set; }
}
public class BarMap : ClassMap<bar> {
public BarMap() {
Map(m => m.Id).Index(2).Name("BarId");
Map(m => m.Name).Index(4).Name("BarName");
}
}
public static void Main() {
Foo foo1 = new Foo("file.txt", "f1", "myFoo");
Bar bar1 = new Bar("b1", "myBar");
using (var reader = new StreamReader("Ruta/a/mi/csv"))
using (var csv = new CsvWriter(reader, CultureInfo.InvariantCulture)) {
csv.Context.RegisterClassMap<foomap>();
csv.Context.RegisterClassMap<barmap>();
csv.WriteHeader<foo>();
csv.WriteHeader<bar>();
csv.NextRecord();
while (csv.Read()) {
csv.WriteRecord(foo);
csv.WriteRecord(bar);
csv.NextRecord();
}
}
}
El constructor de la clase es básico. Si quieres que lo publique también, ¡lo haré! Mi pregunta principal es si es posible mezclar las dos clases dentro de los mapas en lugar de escribir manualmente cada campo.
davy.ai
Sí, es posible combinar las dos clases dentro de los mapas. En el
FooMap
, puedes agregar las propiedades de la claseBar
utilizando el métodoReferences
. Aquí está el código actualizado paraFooMap
:En este código, estamos haciendo referencia a
BarMap
y especificando qué propiedades deFoo
deben asignarse a qué propiedades deBar
. Esto debería resultar en la salida deseada que especificaste en el CSV.