2

詳細行に情報が表示される順序をヘッダーが示す CSV ファイルがあります。例は次のとおりです。

COLUMN1,COLUMN2,COLUMN3
VALUE1,VALUE2,VALUE3

しかし、そうである可能性もあります

COLUMN2,COLUMN3,COLUMN1
VALUE2,VALUE3,VALUE1

クラスは次のようになります

public class CSVImportLineItem
{
    public string Column1 {get; set;}
    public string Column2 {get; set;}
    public string Column3 {get; set;}
}

( FileHelpersを使用して) ヘッダーを読み取り、ヘッダーの順序に基づいてプロパティへのマッピングを決定する方法はありますか?

4

2 に答える 2

1

ClassBuilder ヘルパー クラスの 1 つを使用できます。

DelimitedClassBuilder cb = new DelimitedClassBuilder("LineItem");
// First field
cb.AddField("Column2", typeof(string));
// Second field
cb.AddField("Column1", typeof(string));
// Third field
cb.AddField("Column3", typeof(string));

engine = new FileHelperEngine(cb.CreateRecordClass());
LineItem[] lineItems = engine.ReadFile("FileIn.txt") as LineItem[];

最初の行の内容に基づいてフィールドの順序を変更できます (FileHelpers の外部で読み取ることができます)。

こちらの回答も参照してください。

于 2013-03-04T15:53:52.617 に答える
1

FileHelpersライブラリを特に使用する必要がある理由は何ですか?

  //Use File.ReadAllLines();
  List<string> lines = new List<string>() { "Column1, Column2, Column3", "1,2,3" };
  var cols = lines.First().Split(',');
  List<CSVImportLineItem> imported = new List<CSVImportLineItem>();
  var v = lines.Skip(1).ToList().Select(line =>
     {
       CSVImportLineItem item = new CSVImportLineItem();
       var values = line.Split(',');
       for (int i = 0; i < cols.Count(); i++)
       {
         item.GetType().GetProperty(cols[i].Trim()).SetValue(item, values[i], null);
       }
       return item;
     }).ToList();
于 2013-02-05T10:17:49.437 に答える