7

NuGet 経由で入手できるhttps://joshclose.github.io/CsvHelper/は、CSV ファイルの読み取りと書き込みに使用されます。

CsvHelper を使用すると、CSV ファイルをカスタム クラスに直接読み込むことができます。

以下は前の質問で示されたように

var streamReader = // Create a reader to your CSV file.
var csvReader = new CsvReader( streamReader );
List<MyCustomType> myData = csvReader.GetRecords<MyCustomType>();

CsvReader は、ヘッダー行に基づいてプロパティ名を一致させる方法を自動的に判断します (これは構成可能です)。リフレクションの代わりにコンパイルされた式ツリーを使用するため、非常に高速です。

また、非常に拡張可能で構成可能です。

私は基本的に、ヘッダー (不明な名前) を含む CSV ファイルを読み取り、レコードをカスタム オブジェクトに読み取る方法を考え出そうとしています。

これに関するドキュメントはまったくないので、CsvReader を使用して値を文字列の配列に並べる方法を誰かが知っているかどうか疑問に思いましたか、またはこれをどのように処理することをお勧めしますか?

4

3 に答える 3

9

これは私の最初のバージョンです。物事を修正してより完全にするときに更新しますが、これにより、文字列配列のすべてのデータが得られます。

   [HttpPost]
        public ActionResult UploadFile(HttpPostedFileBase file)
        {

            ICsvParser csvParser = new CsvParser(new StreamReader(file.InputStream));
            CsvReader csvReader = new CsvReader(csvParser);
            string[] headers = {};
            List<string[]> rows = new List<string[]>();
            string[] row;
            while (csvReader.Read())
            {
                // Gets Headers if they exist
                if (csvReader.HasHeaderRecord && !headers.Any())
                {
                    headers = csvReader.FieldHeaders;
                }
                row = new string[headers.Count()];
                for (int j = 0; j < headers.Count(); j++)
                {
                    row[j] = csvReader.GetField(j);
                }
                rows.Add(row);
            }
            ImportViewModel model = new ImportViewModel(rows);
            return View(model);
        }
于 2011-05-05T22:20:06.087 に答える
5

CsvFieldAttributecsv フィールドの名前または csv フィールドのインデックスのいずれかを配置できるプロパティに配置できる があります。名前は、csv ファイルにヘッダー行がある場合にのみ機能します。

public class MyCustomClass
{
    [CsvField( FieldIndex = 1 )]
    public string Property1 { get; set; }

    [CsvField( FieldIndex = 0 )]
    public string Property2 { get; set; }

    [CsvField( FieldIndex = 2 )]
    public string Property3 { get; set; }
}

レコードをファイル内の順序で文字列配列に読み込むことだけが必要な場合は、CsvParser代わりにCsvReader. を呼び出すCsvParser.Read()と、 が返されますstring[]。生データの読み取りにCsvReader使用します。CsvParser

https://github.com/JoshClose/CsvHelper/wiki/Fluent-Class-Mapping

于 2011-04-02T05:06:15.460 に答える
1

これが CVSHelpers とは関係ないことはわかっていますが、 FileHelpersプロジェクトを検討してみてください。

オブジェクトのフィールドを属性で装飾して、csv ファイルの行を表し、FileHelperEngine を使用してファイルを読み込むことができます。その結果、それぞれが行を表すオブジェクトの配列になります。

区切りファイルの読み取りに関するこのクイックスタートを参照してください

于 2011-03-31T08:12:30.093 に答える