2012-03-06 42 views
0

我有有一欄爲時間和時間的格式看起來像(CSV文件) 8時22分07秒DataGridView的顯示時間爲日期

的DataGridView將其轉換爲CSV文件看起來像

12/30/1899 8:22 AM 

有什麼建議嗎?

我的代碼看起來像

public static DataTable ParseCSV(string path, String pattern) 
    { 
     if (!File.Exists(path)) 
      return null; 
     string full = Path.GetFullPath(path); 
     string file = Path.GetFileName(full); 
     string dir = Path.GetDirectoryName(full); 
     string connString = "Provider=Microsoft.Jet.OLEDB.4.0;" 
      + "Data Source=\"" + dir + "\\\";" 
      + "Extended Properties=\"text;HDR=Yes;FMT=Delimited\""; 
     string query = "SELECT [Pc-Tag], [User-Name], [Date], [Time] FROM " + file;// +" WHERE [User-Name] LIKE " + pattern; 
     DataTable dTable = new DataTable(); 
     OleDbDataAdapter dAdapter = new OleDbDataAdapter(query, connString); 
     try 
     { 
      dAdapter.Fill(dTable); 
     } 
     catch (InvalidOperationException ioe) 
     { 
      Console.WriteLine(ioe.Message.ToString()); 
     } 
     dAdapter.Dispose(); 
     return dTable; 
    } 

回答

2

您可以配置列使用特定格式字符串像T,這是很長一段時間格式(HH:MM:SS)。

使用包含您的時間值的列的DefaultCellStyle.Format屬性來做到這一點。您可以使用窗體設計器(單擊當您選擇DataGridView控件時顯示的小箭頭,然後選擇「編輯列」,選擇該列,然後按DefaultCellStyle屬性的「...」按鈕),或者可以執行它在代碼中。

只需確保手動添加列(在設計器或代碼中),並將AutoGenerateColumns屬性設置爲false

0

你預計有多少行? 對於少數(< 1000)行我會做:

.... 
dAdapter.Dispose(); 

dtable.Columns.Add("Custom", typeof(string)); 

foreach(var row in dtable.Rows) 
{ 
    row["Custom"] = "17:15:30"; //here goes your logic to convert the Time Value 
           // example: row["Time"].ToString("T"); 
} 

return dTable; 

具有更好的性能的另一種解決方案是增加的表達柱;

http://msdn.microsoft.com/de-de/library/system.data.datacolumn.expression%28v=vs.80%29.aspx

var expression = "SUBSTRING([Time], 11, IF(LEN([Time]) = 19, 8, 7))"; 
dtable.Columns.Add("Custom", typeof(string), expression); 
+0

你會怎麼做,如果你有1500行? – 2012-03-06 16:12:36

+0

@Thorsten - 我會用一個表達式,這樣會更快。看看我更新的解決方案。 – 2012-03-07 07:51:48