将DataTable导出为CSV时出现逗号问题

Dot*_*NET 3 .net c# csv wpf export-to-csv

我已经采用了一些将DataTable转换为CSV文件的代码.它似乎运行良好,除了在实际数据中使用逗号.有没有办法在这种情况下显示逗号?这就是我所做的:

StringBuilder sb = new StringBuilder();

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);
sb.AppendLine(string.Join(",", columnNames));

foreach (DataRow row in dtResults.Rows)
{
    IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString());
    sb.AppendLine(string.Join(",", fields));
}

File.WriteAllText(saveFileDialog.FileName, sb.ToString());
Run Code Online (Sandbox Code Playgroud)

Pao*_*sco 7

如果字段包含逗号,则应将其放在双引号(或单引号)中.

您可以使用FileHelpers库来创建CSV文件,它应该正确地进行转义.

如果您不想使用该库,基本位是:如果您有逗号,则必须将您的字段放在引号内,例如

ID, NAME
1, "Doe, John"
2, 'Doe, Jane'
Run Code Online (Sandbox Code Playgroud)

如果您的字段包含引号,则应使用其他引号将其转义:

3, "Anakin ""Darth Vader"", Skywalker"
4, 'O''Connor, Sinead'
Run Code Online (Sandbox Code Playgroud)

可能的解决方案:

static string CsvEscape(this string value) {
    if (value.Contains(",")) {
        return "\"" + value.Replace("\"", "\"\"") + "\"";
    }
    return value;
}
Run Code Online (Sandbox Code Playgroud)

然后在你的代码中:

IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString().CsvEscape());
Run Code Online (Sandbox Code Playgroud)

PS:根据维基百科,没有真正的csv规范,但RFC 4180描述了经常使用的格式.