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

本文关键字:问题 CSV DataTable | 更新日期: 2023-09-27 18:00:02

我采用了一些将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());

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

如果字段包含逗号,则应将其置于双(或单)引号中。

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

如果你不想使用库,关键是:如果你有逗号,你必须把你的字段放在引号里,例如

ID, NAME
1, "Doe, John"
2, 'Doe, Jane'

如果您的字段包含引号,则应使用一个额外的引号转义它们:

3, "Anakin ""Darth Vader"", Skywalker"
4, 'O''Connor, Sinead'

一个可能的解决方案:

static string CsvEscape(this string value) {
    if (value.Contains(",")) {
        return "'"" + value.Replace("'"", "'"'"") + "'"";
    }
    return value;
}

然后在你的代码中:

IEnumerable<string> fields = row.ItemArray.Select(field => field.ToString().CsvEscape());

p.S:根据维基百科的说法,没有真正的csv规范,但RFC4180描述了一种经常使用的格式。

我发布了以下修改后的代码,这将对您有所帮助。

StringBuilder sb = new StringBuilder();
            string[] val =  { "ramesh","suresh, Ganesh" };
            IEnumerable<string> columnNames = val;
            IList<string> objFinal = new List<string>();
            foreach (string v in columnNames)
            {
                string temp = v;
                if (temp.Contains(","))
                    temp = "'"" + v + "'"";
                objFinal.Add(temp);
            }
            sb.AppendLine(string.Join(",", objFinal.AsEnumerable<string>()));
            }            

CSV支持双代码之间数据中的逗号。

您可以在以下单行代码的帮助下,在单个镜头中附加双代码以及逗号

IEnumerable<string> columnNames = dtResults.Columns
                                           .Cast<DataColumn>()
                                           .Select(column => column.ColumnName);
var res = columnNames.Aggregate((current, next) => "'"" + current + "'"" + ", " + "'"" + next + "'"");

File.WriteAllText(saveFileDialog.FileName, res.ToString());