27

だから私は自分のCSVリーダー/ライターを書くべきではないことを読んでいたので、nuget経由でインストールされたCsvHelperライブラリを使用しようとしていました. CSV ファイルはグレースケール画像で、行数が画像の高さ、列数が幅になります。List<string>値を行単位で単一のorに読み込みたいと思いますList<byte>

私がこれまでに持っているコードは次のとおりです。

using CsvHelper;

public static List<string> ReadInCSV(string absolutePath)
{
    IEnumerable<string> allValues;

    using (TextReader fileReader = File.OpenText(absolutePath))
    {
        var csv = new CsvReader(fileReader);
        csv.Configuration.HasHeaderRecord = false;
        allValues = csv.GetRecords<string>
    }

    return allValues.ToList<string>();
}

しかしallValues.ToList<string>()、投げている:

CsvConfigurationException はユーザー コードによって処理されませんでした

タイプ 'CsvHelper.Configuration.CsvConfigurationException' の例外が CsvHelper.dll で発生しましたが、ユーザー コードで処理されませんでした

追加情報: IEnumerable を継承する型は自動マップできません。レコードのリストに作用する GetRecords または WriteRecords を呼び出す代わりに、単一のレコードに作用する GetRecord または WriteRecord を誤って呼び出しましたか?

GetRecordsおそらく私自身のカスタムクラスを期待していますが、値をプリミティブ型または文字列として求めているだけです。また、各値が個別の文字列ではなく、行全体が単一の文字列に変換されていると思われます。

4

6 に答える 6

29

@Marc Lの投稿によると、これを試すことができます:

public static List<string> ReadInCSV(string absolutePath) {
    List<string> result = new List<string>();
    string value;
    using (TextReader fileReader = File.OpenText(absolutePath)) {
        var csv = new CsvReader(fileReader);
        csv.Configuration.HasHeaderRecord = false;
        while (csv.Read()) {
           for(int i=0; csv.TryGetField<string>(i, out value); i++) {
                result.Add(value);
            }
        }
    }
    return result;
}
于 2015-10-23T04:45:36.980 に答える
17

配列内の各行の文字列値だけが必要な場合は、パーサーを直接使用できます。

var parser = new CsvParser( textReader );
while( true )
{
    string[] row = parser.Read();
    if( row == null )
    {
        break;
    }
}

http://joshclose.github.io/CsvHelper/#reading-parsing

アップデート

バージョン 3 では、プロパティの読み取りと書き込みがサポートされていIEnumerableます。

于 2015-10-23T16:00:12.863 に答える