2017-06-06 16 views
0

リストをCSV string.listに変換しようとしています。リストに200以上のプロパティがあります。 例
ID、名前、クラス、姓....など..
1、試験、第二、テスト....ように..
2、TEST2、第二、TEST2 ...ように...リストをcsv文字列に変換

私のforeachと

foreach (var value in testData) 
     { 
      sb.Append(separator).Append(value); 
      separator = ","; 
       sb.Append(separator).Append(value); 
      separator = ","; 
     } 
を追加使用

200行のプロパティを渡す必要があり、コード行が増えます。

+0

単一オブジェクト内の200のプロパティ...? 200?ワット?どういうわけか、あなたの状況を正しく説明してくれなかったと感じています... – elgonzo

+0

彼はスニペットでプロパティ名を書く必要があり、プロパティ名を書く必要がありません。これは私の推測です...だから、ソースオブジェクトと型と構造が必要です。 –

+0

@AndrewPaes、私は、リフレクションを使用するコメントでほぼ示唆していました。しかし、200以上の物件は、私の目では面倒くさいと思っているだけです。あなたが言ったように、おそらく他のタイプ/構造/データセットが関与しているだけでなく、単純にプロパティが... – elgonzo

答えて

0

ここでは、オブジェクトを取得してプロパティ値を読み取り、それをcsv'd文字列としてフォーマットする実装を行っています。

Write.WriteObject()は、どのように使用するかの例です。

public static class StringExtensions 
{ 
    public static string ToCSV(this object field, bool first) 
    { 
     if(field != null) 
     { 
      string retVal = field.ToString(); 
      retVal = retVal.Contains(",") || retVal.Contains("\"") || retVal.Contains("\r\n") 
       ? "\"" + retVal + "\"" : retVal; 
      retVal = first ? retVal : "," + retVal; 
      return retVal; 
     } 
     else 
     { 
      return first ? "" : ","; 
     } 
    } 
} 

public class Format 
{ 
    public string CommaSeparatedObject(Type layoutType, object value, bool header) 
    { 
     bool first = true; 

     string retVal = ""; 
     PropertyInfo[] props = layoutType.GetProperties(); 

     if (header) 
     { 
      foreach (PropertyInfo prop in props) 
      { 
       retVal += prop.Name.ToCSV(first); 
       first = false; 
      } 
     } 
     else 
     { 
      foreach (PropertyInfo prop in props) 
      { 
       retVal += prop.GetValue(value).ToCSV(first); 
       first = false; 
      } 
     } 


     return retVal; 
    } 
} 

public class Write 
{ 
    public void WriteObject(IEnumerable<myClass> myObj) 
    { 
     StreamWriter sw = new StreamWriter(parameters.OutputFile, true, Encoding.ASCII, 16 * 1024); 

     sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, true))); //write header 

     foreach(var item in myObj) 
     { 
      sw.WriteLine(new Format().CommaSeparatedObject(typeof(myClass), item, false))); 
     } 
    } 
} 
関連する問題