DataTable到CSV日期格式

时间:2014-10-30 15:44:21

标签: c# mysql sql .net datatable

我尝试将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中获取时会出错。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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();
    }
}

答案 2 :(得分:0)

数据库中的数据不知道任何格式;您遇到的行为与此相关并且是正确的 在填写csv时,您的代码采用env / os / locale的默认格式并将其应用于值。

解决问题你有一些可能的解决方案:

  • 您更改源sql代码以生成填充格式化数据的SQL文本字段(这是一个糟糕的选择)

  • 在准备csv时处理格式客户端;您必须修改代码以逐个处理字段,并将正确的格式应用于日期字段

  • 您更改了应用预期格式到日期字段的数据表内容(这可能或可能不依赖于所涉及字段的数据类型)

我喜欢第二种或第三种解决方案,因为我更喜欢在客户端保留格式,但YMMV和帖子中没有足够的信息可以做出正确的选择。