web-dev-qa-db-fra.com

CsvHelper: aucun membre n'est mappé pour le type

J'utilise CsvHelper 4.0.3 .

J'ai un imbriqué classe défini comme ceci:

private class CsvLine {
    public string Solution;
    public string Project;
    public string DependsOnProject;
    public string Weight;
    public string DependsOnPackage;
    public string PackageVersion;
}

Mon fichier .csv, que je souhaite analyser à l'aide de CsvHelper, contient les noms de champs suivants:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion

Voici mon code:

TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();

Selon la documentation ici , le code ci-dessus devrait fonctionner. 

Cependant, lorsque j'inspecte records, je vois le message No members are mapped for type 'ParentClass+CsvLine'

J'ai changé l'accessibilité de CsvLine de private à public, mais cela n'a fait aucune différence.

Qu'ai-je fait de mal?

EDIT: J'ai essayé de dissocier la classe CsvLine et de la rendre publique, mais cela n’a pas aidé non plus.

EDIT: J'ai apporté les modifications comme Nkosi a suggéré } _; Cependant, il est maintenant indiqué que records est une collection vide: "L'énumération n'a donné aucun résultat". Il y a définitivement des données présentes dans mon fichier .csv, donc la collection ne doit pas être vide. 

Voici quelques exemples de données:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion
FOD.sln,ABC.DEF,IMS.ABC,1,,
FOD.sln,ABC.DEF,IMS.DEF,1,,
FOD.sln,ABC.DEF,IMS.GHI,1,,
FOD.sln,ABC.DEF,IMS.JKL,1,,

EDIT: résolu! Les réponses de { Nkosi } _ et _ { Panagiotis ' se complètent.

6
MY_G

Vous devez utiliser Propriétés au lieu de champs dans le modèle d'objet car par défaut, il mappera les membres publics correspondants

public class CsvLine {
    public string Solution { get; set; }
    public string Project { get; set; }
    public string DependsOnProject { get; set; }
    public string Weight { get; set; }
    public string DependsOnPackage { get; set; }
    public string PackageVersion { get; set; }
}

Vous devriez également vous renseigner sur la correspondance de vos classes avec le fichier csv. 

CsvHelper: Class Mapping

7
Nkosi

Nkosi a expliqué que CsvHelper correspond aux propriétés par défaut.

J'ai déjà rencontré le message Enumeration yielded no results dans le débogueur. Le message est trompeur. Il y a are records même si le débogueur dit qu'il n'y en a pas. Vous parcourez IEnumerable avec foreach ou appelez .ToArray() ou .ToList() pour charger tous les enregistrements, par exemple:

var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
     ...
}

Ou 

var records = csvReader.GetRecords<CsvLine>().ToArray();

Vous pouvez forcer le débogueur à afficher tous les éléments d'un IEnumerable dans les fenêtres Regarder, Regarder rapide ou Immédiat en ajoutant la variable resultsspécificateur de format }, par exemple:

records,results

Faites attention car cela va exécuter IEnumerable et renvoyer tous les résultats. 

Vous pouvez trouver cela et d'autres astuces dans 7 pierres précieuses cachées dans Visual Studio 2017

6

Autres causes possibles:

  • En-tête de chaîne de caractères de citation.
  • délimiteur char.

Exemple de code pour les configurer:

var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = '\'';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();
0
Robin Qiu