数据表转换为CSV,使用自定义字符串表示

本文关键字:自定义 字符串 表示 转换 CSV 数据表 | 更新日期: 2023-09-27 18:11:17

我想将DataTable转换为CSV字符串行,并且我希望能够灵活地对每个列的字符串表示形式进行编码(例如:我可能希望Date值采用特定的字符串格式等)

我在这里看到了一些将数据表转换为CSV的通用方法:

但是没有一个方法处理自定义字符串表示。有什么建议吗?

数据表转换为CSV,使用自定义字符串表示

如果是日期,只需检查列类型并指定所需的格式。

DataTable dt = ...
// Your custom date format.
string format = "yyyy-MM-dd";
var sb = new StringBuilder();
foreach (DataRow row in dt.Rows)
{
    sb.AppendLine(string.Join(",", row.ItemArray.Select(item =>
        item is DateTime ? ((DateTime)item).ToString(format) : item.ToString()
    )));
}
File.WriteAllText("test.csv", sb.ToString());

借鉴前面提到的c# datatable到csv,我将创建一个扩展方法,它以两个格式字符串作为参数,如下所示:

    static class MyExtensions
{
    public static string ToCSV(this DataTable dataTable, string rowFormat, string headFormat)
    {
        StringBuilder sb = new StringBuilder();
        IEnumerable<string> columnNames = dataTable.Columns.Cast<DataColumn>().
                                          Select(column => column.ColumnName);
        sb.AppendFormat(headFormat, columnNames.ToArray<string>());
        foreach (DataRow row in dataTable.Rows)
        {
            sb.AppendLine();
            sb.AppendFormat(rowFormat, row.ItemArray);
        }
        return sb.ToString();
    }
}

然后像这样调用它:

using (DataTable dt = new DataTable("Test"))
        {
            dt.Columns.Add(new DataColumn("id", typeof(int)));
            dt.Columns.Add(new DataColumn("value", typeof(double)));
            dt.Columns.Add(new DataColumn("dated", typeof(DateTime)));
            dt.Rows.Add(new Object[] { 1, 2.3, DateTime.Now });
            Console.WriteLine(dt.ToCSV("{0}|'"{1}'"|{2:d}", "{0}|{1}|{2}"));
            Console.ReadKey();
        }

要产生这个:

id|value|dated
1|"2.3"|04/10/2016

这使您可以灵活地精确定义CSV的结构。

如果你不知道它的结构,那么这是没有用的。