【发布时间】:2017-02-11 22:47:07
【问题描述】:
我想将 DataTable 转换为 CSV 字符串行,并且我希望能够灵活地对每列的字符串表示形式进行编码(例如:我可能需要特定字符串格式的日期值等)
我在这里看到了一些将 DataTable 转换为 CSV 的通用方法:c# datatable to csv
但这些方法都没有解决自定义字符串表示。 有什么建议吗?
【问题讨论】:
-
不清楚你想要达到什么目的,你能举几个具体的例子吗?
我想将 DataTable 转换为 CSV 字符串行,并且我希望能够灵活地对每列的字符串表示形式进行编码(例如:我可能需要特定字符串格式的日期值等)
我在这里看到了一些将 DataTable 转换为 CSV 的通用方法:c# datatable to 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 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 的结构。
如果您不了解结构,那么这将无济于事。
【讨论】: