web-dev-qa-db-fra.com

Dans CsvHelper, comment détecter une erreur de conversion et savoir dans quel champ et dans quelle ligne cela s'est produit?

J'utilise la classe CsvReader avec succès et j'en suis satisfait, cependant, le fichier que je consomme est produit par un groupe qui change les formats de colonne sans me le faire savoir.

Donc, un instant, tout fonctionne, puis le lendemain matin, les choses se brisent et le bloc try catch autour de csv.GetRecord<MyType>() capture l'erreur et enregistre l'erreur, mais je ne peux pas collecter d'informations précieuses sur l'instance d'exception. Il dit simplement: "La conversion ne peut pas être effectuée." et le InnerException n'a rien. Pas très utile. Je ne sais même pas laquelle de mes 150 colonnes est à l'origine du problème.

Pouvez-vous m'aider à comprendre comment je peux identifier quelle colonne dans quelle ligne est à l'origine du problème?

Merci

31
t316

Tout d'abord, il semble que j'ai besoin d'attraper CsvTypeConverterException.

 while (csv.Read())
    {
       try
       {    
          var record = csv.GetRecord<MyType>();    
       }
       catch (CsvTypeConverterException ex)
       {
         //ex.Data.Values has more info...
       }
    }

Je sais maintenant comment enquêter sur ce qui n'a pas fonctionné, mais comment puis-je m'assurer que ce champ est ignoré mais que les autres champs de cette ligne sont convertis, afin que toute la ligne ne soit pas supprimée?

Merci

7
t316

Actuellement, il n'existe aucun moyen d'ignorer les erreurs au niveau du champ/de la propriété. Vos options actuelles sont les suivantes:

Regardez les données d'exception.

catch( Exception ex )
{
    // This contains useful information about the error.
    ex.Data["CsvHelper"];
}

Ignorez les exceptions de lecture. C'est au niveau de la ligne, cependant, pas sur le terrain. Cela permettra à tout le fichier d'être lu et ignorera simplement les lignes qui ne fonctionnent pas. Vous pouvez obtenir un rappel lorsqu'une exception se produit.

csv.Configuration.IgnoreReadingExceptions = true;
csv.Configuration.ReadingExceptionCallback = ( ex, row ) =>
{
    // Do something with the exception and row data.
    // You can look at the exception data here too.
};
45
Josh Close