CsvHelper 4.0. を使用します。
私はnestedクラスを次のように定義しています:
private class CsvLine {
public string Solution;
public string Project;
public string DependsOnProject;
public string Weight;
public string DependsOnPackage;
public string PackageVersion;
}
CsvHelper
を使用して解析したい.csvファイルには、次のフィールド名があります。
Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion
これが私のコードです:
TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();
ドキュメントによると ここ 、上記のコードは機能するはずです。
ただし、records
を調べると、No members are mapped for type 'ParentClass+CsvLine'
というメッセージが表示されます。
CsvLine
のアクセシビリティをprivate
からpublic
に変更しましたが、違いはありませんでした。
私は何を間違えましたか?
EDIT:CsvLine
クラスのネストを解除して公開しようとしましたが、それも役に立ちませんでした。
編集:私は Nkosiが提案 ;として変更を加えました。ただし、records
は空のコレクションであると表示されます:「列挙では結果が得られませんでした」。私の.csvファイルには間違いなくデータが含まれているので、コレクションを空にしないでください。
サンプルデータは次のとおりです。
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,,
編集:解決しました! Nkosi's と Panagiotis ' 答えはお互いを補完します。
デフォルトでは、オブジェクトモデルのフィールドの代わりにプロパティを使用する必要があります。これにより、一致するパブリックメンバーがマップされます。
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; }
}
また、クラスをcsvファイルにマッピングする方法についても確認する必要があります。
Nkosiは、CsvHelperはデフォルトでプロパティにマップされると説明しました。
過去にデバッガーで_Enumeration yielded no results
_メッセージに遭遇しました。メッセージは誤解を招くものです。デバッガーがレコードがないと言っていても、areレコードがあります。 foreach
を使用してIEnumerableを反復処理するか、.ToArray()
または.ToList()
を呼び出して、すべてのレコードをロードします。例:
_var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
...
}
_
または
_var records = csvReader.GetRecords<CsvLine>().ToArray();
_
results
フォーマット指定子 を追加することにより、デバッガーにWatch、Quick Watch、またはImmediateウィンドウのIEnumerableにすべてのアイテムを表示させることができます。例:
_records,results
_
これによりIEnumerableが実行され、すべての結果が返されるため、注意してください。
これと他のトリックは Visual Studio 2017の7つの隠された宝石 で見つけることができます
その他の考えられる原因:
それらを構成するためのサンプルコード:
var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = '\'';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();
この問題にはもっと簡単な解決策があります。それはたった1行のコードです。 csvhelperにフィールドを確認するように指示する必要があります。
using (var csv = new CsvWriter(writer))
{
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}
CsvHelper 12.2.2の時点で、これは私がそれを機能させるためにしなければならなかったことです
csv.Read()
csv.ReadHeader()
csv.GetRecords<T>().ToList();
CsvReaderのドキュメントにも関わらず、何らかの理由で、Read()メソッドとReadHeader()メソッドを追加すると、実際にcsvファイルからデータを取得できるようになります。