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.
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.
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 results
spé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
Autres causes possibles:
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>();