DataTable 转 CSV 日期格式

Posted

技术标签:

【中文标题】DataTable 转 CSV 日期格式【英文标题】:DataTable to CSV date format 【发布时间】:2014-12-26 18:09:07 【问题描述】:

我正在尝试将包含多个列的 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 中提取时出现错误。

【问题讨论】:

什么你得到了什么错误? 那么你必须显示你在哪里填写DataTable,但是这个问题应该在另一个问题中解决。 这个问题是关于导出的,但是你提到了一个关于导入的问题。在哪里导入? 为清晰起见已编辑问题 【参考方案1】:

我知道已经有一个公认的答案,但是...

实际上有一种方法可以以一致的方式控制日期的格式,而无需为每种类型的数据指定格式:您可以使用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

【讨论】:

感谢您的见解 Arie - 一个非常有帮助的答案,我将牢记在未来。 +1【参考方案2】:

使用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();
    

【讨论】:

【参考方案3】:

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

要解决问题,您有一些可能的解决方案:

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

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

您更改数据表内容,将预期格式应用于日期字段(这可能会也可能不会,具体取决于所涉及字段的数据类型)

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

【讨论】:

以上是关于DataTable 转 CSV 日期格式的主要内容,如果未能解决你的问题,请参考以下文章

DateTime.Now.ToString("HH:mm:ss.fff");我希望这部分日期格式输出到.CSV文件时就是这么显示。

DataTable 未格式化日期时间

如何将DataTable中的日期格式format

编辑列日期格式后不显示过滤日期 - Laravel Yajra Datatable

使用Rails中的DataTable对格式化的日期列进行排序

phpmyadmin 导入日期格式困难的 csv