2014-10-30 75 views
0

我試圖導出一個DataTable到CSV,有很多列。我希望將date_time列導出爲CSV,同時保留數據庫date_time格式(YYY-MM-DD HH:mm:ss)或類似的內容。數據表爲CSV日期格式

這是我的代碼:

private void DataTableToCsv(string path, DataTable dt) 
     { 
      File.Delete(path); 
      StringBuilder sb = new StringBuilder(); 

      string[] columnNames = dt.Columns.Cast<DataColumn>(). 
               Select(column => column.ColumnName). 
               ToArray(); 
      sb.AppendLine(string.Join(",", columnNames)); 

      foreach (DataRow row in dt.Rows) 
      { 
       string[] fields = row.ItemArray.Select(field => field.ToString()). 
               ToArray(); 
       sb.AppendLine(string.Join(",", fields)); 
      } 

      File.WriteAllText(path, sb.ToString()); 
     } 

的日期出現在不同的格式,試圖從MySQL拿起時它給我的錯誤。

+2

_What_錯誤你得到,在哪裏? – 2014-10-30 15:47:04

+0

然後你必須顯示你在哪裏填寫'DataTable',但是這個問題應該用另一個問題來解決。 – 2014-10-30 15:48:55

+0

這個問題是關於出口,但你提到一個關於進口的問題。導入哪裏? – 2014-10-30 15:49:25

回答

0

隨着DateTime值,可以通過調用

dateTimeField.ToString("yyyy-dd-MM"); 

目前你平等對待所有字段,使用默認的轉換控制輸出:

field => field.ToString() 

您不能指定轉換爲object.ToString()沒有重載這樣做;你必須指定單獨使用的轉化中的每個類型,即:

string[] fields = row.ItemArray.Select(field => ConvertToCsvValue(field)).ToArray(); 

,並在數據庫中

static void ConvertToCsvValue(object value) 
{ 
    if (value is DateTime) 
    { 
     return ((DateTime)value).ToString("yyyy-dd-MM"); 
    } 
    else 
    { 
     return value.ToString(); 
    } 
} 
+0

這似乎已經做了 - - 謝謝:) – 2014-10-30 16:06:59

0

數據並不知悉任何格式的;您遇到的行爲與此相關並且是正確的。
填充csv時,您的代碼將採用env/os/locale的默認格式並將其應用於值。

解決你有一些可能的解決方法:

  • 更改源SQL代碼產生充滿格式化數據的SQL文本字段(恕我直言,一個壞的選擇)

  • 你處理準備csv時格式客戶端;你必須修改你的代碼來逐一處理字段,並在日期字段中應用正確的格式

  • 你改變了應用預期格式到日期字段的數據表內容(這可能是可能的,也可能不取決於數據類型涉及的領域)

我的偏好轉向第二個或第三個解決方案,因爲我更願意保持在客戶端,但情況因人而異,並在您的文章格式沒有足夠的信息來做出正確的選擇。

2

我知道已經有一個公認的答案,但是......

其實有一種方法控制日期的格式以一致的方式,而不指定格式爲每一個類型的數據:您可以使用IFormatProvider

首先,沒有參數的方法object.ToString();正在使用您的線程/應用程序/系統中設置的當前CultureInfo格式化對象。當您需要一致的格式時,這是有問題的,例如當您嘗試將值保存到數據庫時。這不僅是日期問題,還包括數字問題 - 例如,有些語言使用逗號作爲小數點分隔符或在數字中使用千位分隔符,而數據庫並不那麼喜歡。現在想象你的程序運行在具有不同語言設置的計算機上...

話雖如此,許多這些問題可以通過使用object.ToString(CultureInfo.InvariantCulture);來代替。它與英語有關。那麼,2014年10月31日的結果是:10/31/2014 08:35:52

顯然仍然不是你想要的。

您可以進一步通過修改文化控制您的格式有點自己:

CultureInfo format = (CultureInfo) CultureInfo.InvariantCulture.Clone(); 

// those are the formats used by ToString() mathod: 
format.DateTimeFormat.ShortDatePattern = "yyyy-MM-dd"; 
format.DateTimeFormat.ShortTimePattern = "HH:mm:ss"; 

Console.WriteLine(DateTime.Now.ToString(format)); 

double ddd=13.11; 
Console.WriteLine(ddd.ToString(format)); 

string sss = "some string"; 
// although this may not be a good idea: 
Console.WriteLine(sss.ToString(format)); 

結果:

2014-10-31 08:39:53 
13.11 
some string 
+0

感謝您的洞察力阿里 - 一個非常有用的答案,我將永遠銘記未來。 +1 – 2014-10-31 08:15:57