繁体   English   中英

DataTable转换为CSV日期格式

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM