2016-10-03 7 views
0

DataTableをCSV文字列行に変換する必要があり、各列の文字列表現をコーディングする必要があります(例:特定の文字列形式など)カスタム文字列表現を使用したCSVへのDataTable

私はここでCSVへのDataTableに変換するために、いくつかの一般的な方法を見てきました:c# datatable to csv

しかし、方法のいずれもが、カスタム文字列表現に対処していません。 提案がありますか?

+0

達成しようとしていることが明確ではないが、具体的なシナリオ例をいくつかあげてもらえますか? – Arjang

答えて

1

カラムのタイプをチェックして、希望のフォーマット(日付の場合)を指定するだけです。

DataTable dt = ... 

// Your custom date format. 
string format = "yyyy-MM-dd"; 

var sb = new StringBuilder(); 

foreach (DataRow row in dt.Rows) 
{ 
    sb.AppendLine(string.Join(",", row.ItemArray.Select(item => 
     item is DateTime ? ((DateTime)item).ToString(format) : item.ToString() 
    ))); 
} 

File.WriteAllText("test.csv", sb.ToString()); 
1

述べたようにc# datatable to csvからの借入、私はパラメータとして2つのフォーマット文字列を受け取り、このようになります拡張メソッドを作成します:

using (DataTable dt = new DataTable("Test")) 
     { 
      dt.Columns.Add(new DataColumn("id", typeof(int))); 
      dt.Columns.Add(new DataColumn("value", typeof(double))); 
      dt.Columns.Add(new DataColumn("dated", typeof(DateTime))); 
      dt.Rows.Add(new Object[] { 1, 2.3, DateTime.Now }); 
      Console.WriteLine(dt.ToCSV("{0}|\"{1}\"|{2:d}", "{0}|{1}|{2}")); 
      Console.ReadKey(); 
     } 

static class MyExtensions 
{ 
    public static string ToCSV(this DataTable dataTable, string rowFormat, string headFormat) 
    { 
     StringBuilder sb = new StringBuilder(); 

     IEnumerable<string> columnNames = dataTable.Columns.Cast<DataColumn>(). 
              Select(column => column.ColumnName); 
     sb.AppendFormat(headFormat, columnNames.ToArray<string>()); 

     foreach (DataRow row in dataTable.Rows) 
     { 
      sb.AppendLine(); 
      sb.AppendFormat(rowFormat, row.ItemArray); 
     } 
     return sb.ToString(); 
    } 

} 

を次に、このようにそれを呼び出します

これを生産するには:

id|value|dated 
1|"2.3"|04/10/2016 

これにより、CSVの構造を正確に定義することができます。

構造がわからない場合、これは役に立たないでしょう。

関連する問題