2017-07-17 21 views
-1

まず、「XML/JSON/YAMLフォーマットがあり、どのように動作するか知っています。しかし、今私はCSVフォーマットファイルにエクスポートする作業に直面している。私はウィキペディアにCSVについて読んだCSVフォーマットが間違っている

は、CSVのトピックにStackOverflowのを検索し、答えを見つけることができませんでした。

私が読んだとおり、これは将来のExcelテーブルの表示に一般的なフォーマットです。 私がValueTypeのプロパティを持つ単純なクラスを持っていれば、それだけです。

public class MyClass 
{ 
    public int ID { get; set; } 

    public string Name { get; set; } 

    public string ToCsvString() 
    { 
     return string.Format("{0};{1}", ID, Name); 
    } 

    public static MyClass FromCsvString(string source) 
    { 
     var parts = source.Split(';'); 

     var id = int.Parse(parts[0]); 
     var name = parts[1]; 

     return new MyClass() 
     { 
      ID = id, 
      Name = name, 
     }; 
    } 
} 

しかし、少し複雑なクラスがあればどうなりますか?例えば、他のオブジェクトのList<>で。

public class MyClassWithList: MyClass 
{ 
    public MyClassWithList() 
    { 
     ItemsList = new List<string>(); 
    } 
    public List<string> ItemsList { get; set; } 

    public string ToCsvString() 
    { 
     // How to format it for future according to CSV format? 
     return string.Format("{0};{1}", base.ToCsvString(), ItemsList.ToString()); 
    } 

    public static MyClassWithList FromCsvString(string source) 
    { 
     var parts = source.Split(';'); 

     var id = int.Parse(parts[0]); 
     var name = parts[1]; 
     // How to get it back from CSV formatted string? 
     var itemsList = parts[2]; 

     return new MyClassWithList() 
      { 
       ID = id, 
       Name = name, 
       ItemsList = new List<string>() 
      }; 
    } 
} 

どのように私はそれがCSVにデシリアライズ/シリアライズする必要がありますか? 最終的な質問は、クラスAにクラスBインスタンスが含まれている場合に、同じことを行う方法ですか?

+0

CSV処理を間違えるようにする方法はたくさんあります。しかし、これを行う多くの無料のライブラリがあり、うまくいきます。私はここに車輪を再発明することに利点が表示されません。 – hatchet

+0

そのCSVの外観に応じて異なります。エクスポートするフォーマットを定義し、エクスポートするコードを記述することができます。 – David

+0

@David私が書いたように、それはCSVへのインポート/エクスポートを希望しません。それは私が他の人のためにしなければならないことです。私はC#のコールズcsvhelperでナゲットを見てきました。 私はcsvについてのwikipediaの記事も読んでいます。しかし、私はcsvへの "List <>"に関するこの種の問題がどのようにして起こるかを理解するためにここに来ました。 – KamikyIT

答えて

2

まず、データを平坦化する必要があります。

にClassAはClassBのが含まれている場合、あなたは、例えば、任意のネストされたプロパティにアクセスする性質を有する平坦化POCOを作成する必要がありますClassB_PropertyA。ポイントは、単一のリストプロパティを表した後

あなたが本当に唯一の1つの変数lengthプロパティを持つことができ、それが最後のプロパティである必要があり、あなたは、任意の列を持つことができます。

第2に、CSV血清化標準は存在しない。 https://www.ietf.org/rfc/rfc4180.txtがありますが、フィールドからのテキストの読み取りのみを処理します。あなたのロケールを変更するだけの簡単なことは、セミコロンが小文字を表す文化のカンマのために切り替わるので、CSVライブラリを台無しにする可能性があります。 Excelには、Stringへのシリアル化が問題になるバグやエッジケースが多数あります。また、一部のデータは自動的にDatesまたはTimesに変換されます。 CSVを開くプログラムと、CSVデータの処理方法を確認する必要があります。

もし平坦POCOを取得したら、次に、CSVは、オブジェクトごとの行に続く各プロパティの名前と単にヘッダ行です。これであなたを助けるライブラリがあります。

+0

ありがとうございます。 – KamikyIT

+0

@KamikyITもしあなたがカンマを持っていれば、あなたの文字列をエスケープする必要があります。 (またはセミコロン、CSVはローカライズされています) – Novaterata

+1

「第2に、CSV規格はありません」RFC 4180はどうですか? – aquinas

関連する問題