es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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.

Tags:  ,

Answer

  1. Avatar for davy.ai

    Sí, es posible combinar las dos clases dentro de los mapas. En el FooMap, puedes agregar las propiedades de la clase Bar utilizando el método References. Aquí está el código actualizado para FooMap:

    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");
            References<barmap>(m => m.Id, "BarId");
            References<barmap>(m => m.Name, "BarName");
        }
    }
    

    En este código, estamos haciendo referencia a BarMap y especificando qué propiedades de Foo deben asignarse a qué propiedades de Bar. Esto debería resultar en la salida deseada que especificaste en el CSV.

Comments are closed.