我有一个CSV文件,其中包含一段时间列,时间格式化为(在CSV文件中) 8点22分07秒
DataGridView会将其转换为
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;
}
答案 0 :(得分:2)
您可以将列配置为使用某个格式字符串,例如T
,这是长时间格式(hh:mm:ss)。
使用包含时间值的列的DefaultCellStyle.Format
属性来执行此操作。您可以使用表单设计器(单击选择DataGridView
控件时显示的小箭头,然后选择“编辑列”,选择列,然后按“{”按钮{{1您可以在代码中执行此操作。
只需确保手动添加列(在设计器或代码中),并将DefaultCellStyle
属性设置为AutoGenerateColumns
。
答案 1 :(得分: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);