2011-07-14 13 views
5

(私はC++プログラマーです - C#を学ぼうとしていますが、オブジェクトの直列化が組み込まれているようですが、ここの水が...)(de)CSVからオブジェクト(またはできればオブジェクトのリスト)へのシリアル化

私は、CSVファイルからオブジェクトのコレクションにテストデータを読み込むように求められました。 (CSVは人間よりも簡単で読みやすいので、xmlよりも優先されます。ユニットテストを実行するためのテストデータを作成しています)

コレクションは(単純な)オブジェクトのリストになります。

List<MyObject> 

ここで、MyObjectは、2倍の数と数個のintを含むクラスです。

これを行うにはどのような方法が良いですか?私はこれらのオブジェクトの1つだけを直列化する必要があるとは思わない。

1つの行が1つのオブジェクトを表し、ファイルの行のセットがリスト/コレクションを作成するために使用されると思います。

答えて

7

はトリックを行う必要があり、ちょうど私が働いていたデータ変換プロジェクトのために数ヶ月前にこれをしました。

CSV(または文字区切り文字列)を使用している人にとっては、実際にはそれに適した特定のライブラリを使用してください。私が見つけた最も人気のあるものは以下の通りです(かなり試して真実)

あなたはstring.Split(',')で始まり、誰かが誤ってテストデータファイルにコンマを投げたときはどうしますか? ...それだけで悪夢の後に悪夢だとこのライブラリはあなたのためにそれのほとんどを横断した:

http://www.codeproject.com/KB/database/CsvReader.aspx?msg=3227161

using System.IO; 
using LumenWorks.Framework.IO.Csv; 

static class Program 
{ 

    public class MyObject 
    { 
     public int Prop1 { get; set; } 
     public string Prop2 { get; set; } 
     public decimal Prop3 { get; set; } 
    } 

    void ReadCsv() 
    { 
     //holds the property mappings 
     Dictionary<string, int> myObjectMap = new Dictionary<string, int>(); 

     List<MyObject> myObjectList = new List<MyObject>(); 

     // open the file "data.csv" which is a CSV file with headers 
     using (CsvReader csv = new CsvReader(new StreamReader("data.csv"), true)) 
     { 
      int fieldCount = csv.FieldCount; 
      string[] headers = csv.GetFieldHeaders(); 

      for (int i = 0; i < fieldCount; i++) 
      { 
       myObjectMap[headers[i]] = i; // track the index of each column name 
      } 

      while (csv.ReadNextRecord()) 
      { 
       MyObject myObj = new MyObject(); 

       myObj.Prop1 = csv[myObjectMap["Prop1"]]; 
       myObj.Prop2 = csv[myObjectMap["Prop2"]]; 
       myObj.Prop3 = csv[myObjectMap["Prop3"]]; 

       myObjectList.Add(myObj); 
      } 
     } 
    } 
} 
+0

を使用すると、ヘッダーとCSVファイルとはどういう意味ですか?行ごとに整理されていないデータがあり、データを解析する必要がある場合はどうすればよいですか? –