in Informatica, Programmazione

CsvHelper e colonne opzionali

CsvHelper è una libreria .net che consente di leggere e scrivere file csv . Trovo questa libreria particolarmente comoda perchè è ampiamente configurabile, il che la rende piuttosto flessibile.

Uno dei problemi in cui mi sono imbattuto è la necessità di parsare file csv differenti, andando a generare però una lista di oggetti comune. Questo è il caso di tracciati differenti che devono convogliare in un’ unica lista di oggetti. In questo caso la soluzione che ho adottato è stata quella di creare la classe dell’oggetto comune con l’unione di tutti i campi dei diversi tracciati.

L’idea è quella di utilizzare il parser per popolare solo i campi presenti all’interno del file csv, lasciando con il valore di default tutti gli altri.

CsvHelper consente di utilizzare una classe mapper che viene utilizzata durante le fasi di lettura, all’interno della quale possono essere indicati i campi che dovranno essere opzionali.

In questo modo, non verranno generate eccezioni durante il parsing.

Analizziamo il seguente codice:

 using (var reader = new StreamReader("path\\to\\file.csv"))
    using (var csv = new CsvReader(reader, CultureInfo.InvariantCulture))
    {
        csv.Context.RegisterClassMap<ClassePerLaMappatura>();
        csv.GetRecords<DestinationClass>().ToList();
    }

prima di procedere con la lettura del file csv (alla riga 5), definiamo le regole per la mappatura (un pò come avviene con altre librerie, es. Automapper).

La classe utilizzata per la mappatura deve ereditare da ClassMap:

public class FooMap : ClassMap<ClassePerLaMappatura>
{
    public ClassePerLaMappatura()
    {
        Map(m => m.Id);
        Map(m => m.Name);
        Map(m => m.Date).Optional();
    }
}

nell’esempio precedente il campo Date viene indicato come opzionale, quindi se non sarà presente come colonna all’interno del file csv, non verrà generata nessuna eccezione e verrà considerato con il suo valore di default.