【问题标题】:DataTable to CSV with custom string representation具有自定义字符串表示的 DataTable 到 CSV
【发布时间】:2017-02-11 22:47:07
【问题描述】:

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

我在这里看到了一些将 DataTable 转换为 CSV 的通用方法:c# datatable to csv

但这些方法都没有解决自定义字符串表示。 有什么建议吗?

【问题讨论】:

  • 不清楚你想要达到什么目的,你能举几个具体的例子吗?

标签: c# csv datatable


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    如前所述,借用c# datatable to 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 的结构。

    如果您不了解结构,那么这将无济于事。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-05-08
      • 1970-01-01
      • 1970-01-01
      • 2013-08-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多