Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/288.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 数据表转换为CSV日期格式_C#_Mysql_Sql_.net_Datatable - Fatal编程技术网

C# 数据表转换为CSV日期格式

C# 数据表转换为CSV日期格式,c#,mysql,sql,.net,datatable,C#,Mysql,Sql,.net,Datatable,我正在尝试将数据表导出到CSV,其中包含许多列。我希望将日期时间列导出为CSV,同时保留数据库日期时间格式(YYY-MM-DD HH:MM:ss)或类似格式 这是我的代码: private void DataTableToCsv(string path, DataTable dt) { File.Delete(path); StringBuilder sb = new StringBuilder(); st

我正在尝试将数据表导出到CSV,其中包含许多列。我希望将日期时间列导出为CSV,同时保留数据库日期时间格式(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());
        }
private void DataTableToCsv(字符串路径,DataTable dt)
{
删除(路径);
StringBuilder sb=新的StringBuilder();
string[]columnNames=dt.Columns.Cast()。
选择(column=>column.ColumnName)。
ToArray();
sb.AppendLine(string.Join(“,”,columnNames));
foreach(数据行中的数据行)
{
string[]fields=row.ItemArray.Select(field=>field.ToString())。
ToArray();
sb.AppendLine(string.Join(“,”字段));
}
writealText(路径,sb.ToString());
}

日期以不同的格式显示,这给了我从MySQL获取数据时的错误。

使用
DateTime
值,您可以通过调用

dateTimeField.ToString("yyyy-dd-MM");
目前,您将平等对待所有字段,并使用默认转换:

field => field.ToString()
不能将转换指定为
对象。ToString()
没有重载;您必须分别为每种类型指定要使用的转换,即:

string[] fields = row.ItemArray.Select(field => ConvertToCsvValue(field)).ToArray();


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

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

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

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

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


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

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

实际上,有一种方法可以以一致的方式控制日期的格式,而不必为每种类型的数据指定格式:您可以使用
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.
2014-10-31 08:39:53
13.11
some string