如何将DataTable控制为CSV到String()格式

本文关键字:String 格式 CSV DataTable 控制 | 更新日期: 2023-09-27 18:26:04

我有一个小应用程序在我的机器上运行良好,在那里我可以从MySQL数据库中提取数据到DataTable,然后将该DataTable写入CSV,没有任何问题,然后有人试图在他们的机器上运行此操作,和datetime列开始出现与预期不同的行为:在我的机器上,我有这样的东西:(这就是我想要的)

2015-11-14 00:00:00,  
2015-11-14 00:01:00, 
2015-11-14 00:02:00, 
2015-11-14 00:03:00,  

但在另一台机器上:

15/07/2015 4:40:55 PM,  
15/07/2015 4:41:56 PM,  
15/07/2015 4:42:55 PM,  
15/07/2015 4:43:55 PM,  
15/07/2015 4:44:56 PM,  

我的代码是:

    try
    {
        lock (writtingLock)
        {
            Thread.CurrentThread.CurrentCulture = new CultureInfo("en-CA");
            dataTable = newMyDataTable;
            fileId = dataTable.TableName;
            PathMaker path = new PathMaker(fileId);
            path.Make();
            // writing the table to a file
            using (StreamWriter swr =
                new StreamWriter(File.Open(path.filePath, FileMode.Create), Encoding.Default, 1000000))
            // change buffer size and Encoding to your needs
            {
                if (addHeader)
                {
                    foreach (var dc in dataTable.Columns)
                    {
                        swr.Write(dc.ToString() + ",");
                    }
                    swr.WriteLine();
                }
                foreach (DataRow dr in dataTable.Rows)
                {
                    Object[] test = dr.ItemArray;
                    test.Where(o => o.GetType() == typeof(DateTime)).Select(t => (DateTime)t).Select(x => x.ToFileTime());
                    swr.WriteLine(string.Join(",", test.Select(x => x.ToString().TrimEnd(null)).ToArray()));
                }
            }
        }
    }

添加或删除Thread.CurrentThread.CurrentCulture = new CultureInfo("en-CA");没有效果,如何解决此问题?是否有控制格式的方法?

如何将DataTable控制为CSV到String()格式

在行中:

swr.WriteLine(string.Join(",", test.Select(x => x.ToString().TrimEnd(null)).ToArray()));

查看x.ToString()表达式。

.Net正在使用过载解析来知道它需要调用DateTime.ToString()。该方法的文档包括以下内容:

此方法使用从当前区域性派生的格式信息。特别是,它结合了ShortDatePattern和LongTimePattern 返回的自定义格式字符串

换句话说,其他计算机的日期格式选项与您的不同。

您开始通过在代码的早期设置线程区域性来解释这一点。但是,如果我将自己的系统设置为使用en-CA区域性,然后在我的机器上自定义日期/时间格式,那么将en-CA区域性应用于线程仍然会使用我自定义的日期-时间格式,因为我已经说过en-CA在这个系统上应该是这样的。

你可能不喜欢它,但这是一件非常正常的事情,作为程序员,当我们需要精确的格式时,我们应该提前考虑。看起来你确实需要一个精确的格式,你需要调整这个代码,使其足够聪明,知道日期类型和其他类型之间的区别,这样你就可以指定你需要的精确格式。

您希望对数字类型(intfloatdecimalsingledouble等)执行相同的操作,因为这些类型的输出也可能因系统当前区域性设置而异。

有一条捷径。您可以使用InvariantCulture。但是,只有当InvariantCulture恰好具有您想要的格式时,这才会起作用。如果你需要一些不同的东西,你可以重新处理不同的类型。不过,有时,不变量文化可能是一个有用的起点。例如,它可能对数字是正确的,因此您只需要提供日期的格式。

最后,当我在这里的时候,我想调出前面的代码行:

test.Where(o => o.GetType() == typeof(DateTime)).Select(t => (DateTime)t).Select(x => x.ToFileTime());

该代码无效它不会分配回test变量,因此它所做的任何工作(谢天谢地,这并不多,因为枚举器从未执行过)都会被丢弃。你可能应该删除这行。

使用DateTime::ToString("o", CultureInfo.InvariantCulture )