[英]DataTable to CSV date format
我正在尝试将DataTable导出为具有许多列的CSV。 我希望将date_time列导出为CSV,同时保留数据库的date_time格式(YYY-MM-DD HH:mm:ss)或类似的内容。
这是我的代码:
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提取时给了我错误。
我知道已经有一个可以接受的答案,但是...
实际上, 有一种方法可以以一致的方式控制日期的格式,而无需为每种数据类型指定格式:您可以使用IFormatProvider
首先,方法object.ToString();
如果没有参数,则使用线程/应用程序/系统中设置的当前CultureInfo格式化对象。 当您需要一致的格式时(例如,当您尝试将值保存到数据库中时),这是有问题的。 它不仅对日期而且对数字都有问题-例如,有一些语言使用逗号作为小数点分隔符或在数字中使用千位分隔符,而数据库不太喜欢这种语言。 现在,假设您的程序在具有不同语言集的计算机上运行...
话虽如此,通过使用object.ToString(CultureInfo.InvariantCulture);
可以避免许多此类问题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
使用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();
}
}
数据库中的数据不知道任何格式; 您所经历的行为与此相关并且是正确的。
填充csv时,您的代码采用env / os / locale的默认格式并将其应用于值。
要解决此问题,您有一些可能的解决方案:
您更改源sql代码以产生一个填充了格式化数据的sql文本字段(恕我直言,这是错误的选择)
您在准备csv时要处理格式客户端; 您必须修改代码以将正确的格式应用于日期字段来逐一处理字段
您更改数据表内容,将期望的格式应用于日期字段(这可能是可能的,或取决于所涉及字段的数据类型)
我偏爱第二种或第三种解决方案,因为我更喜欢在客户端保留格式,但是YMMV和您的帖子中没有足够的信息来做出适当的选择。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.