C#中DataTable到CSV的转换
将DataTable数据保存到CSV文件时,可能会遇到数据分隔不正确的问题。以下提供解决方案:
考虑以下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | <code class = "language-csharp" >StringBuilder sb = new StringBuilder();
foreach (DataColumn col in dt.Columns)
{
sb.Append(col.ColumnName + ',' );
}
sb.Remove(sb.Length - 1, 1);
sb.Append(Environment.NewLine);
foreach (DataRow row in dt.Rows)
{
}
File.WriteAllText( "test.csv" , sb.ToString());</code>
|
登录后复制
上述代码创建的CSV文件仅包含每行第一个单元格的数据。为了解决这个问题,可以使用更健壮的方法:
.NET 3.5及以上版本
1 2 3 4 5 6 7 8 9 10 11 | <code class = "language-csharp" >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( "test.csv" , sb.ToString());</code>
|
登录后复制
.NET 4.0及以上版本
对于.NET 4.0及以上版本,代码可以进一步简化:
1 2 3 4 5 6 7 8 9 10 11 | <code class = "language-csharp" >StringBuilder sb = new StringBuilder();
IEnumerable<string> columnNames = dt.Columns.Cast<DataColumn>().Select(column => column.ColumnName);
sb.AppendLine(string.Join( "," , columnNames));
foreach (DataRow row in dt.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
sb.AppendLine(string.Join( "," , fields));
}
File.WriteAllText( "test.csv" , sb.ToString());</code>
|
登录后复制
处理特殊字符
如果需要处理数据字段中的特殊字符(例如双引号),可以修改代码中的循环块:
1 2 3 4 5 6 | <code class = "language-csharp" > foreach (DataRow row in dt.Rows)
{
IEnumerable<string> fields = row.ItemArray.Select(field =>
string.Concat( "\"" , field.ToString().Replace( "\"" , "\"\"" ), "\"" ));
sb.AppendLine(string.Join( "," , fields));
}</code>
|
登录后复制
此外,为了避免内存中出现大型文档,可以逐行写入CSV内容,而不是一次性写入整个文档。
以上是如何在 C# 中高效地将 DataTable 转换为 CSV 文件?的详细内容。更多信息请关注PHP中文网其他相关文章!