【问题标题】:Comma issue when exporting DataTable to CSV将 DataTable 导出为 CSV 时出现逗号问题
【发布时间】:2013-02-02 23:35:26
【问题描述】:

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

【问题讨论】:

标签: c# .net wpf csv export-to-csv


【解决方案1】:

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

您可以使用FileHelpers library 创建您的 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:根据Wikipedia 没有真正的csv 规范,但RFC 4180 描述了一种经常使用的格式。

【讨论】:

  • 或者要将OP 更改为他的大部分代码,在选择字段时使用@"\"" + field @"\""? :)
  • @LukeHennerley - 请您详细说明一下吗? :)
  • @DotNET 如果您遇到可以在某些数据中包含分隔符的情况,您应该用双引号将数据括起来 ""
  • @LukeHennerley 但是如果我在数据中也有"" 怎么办? ://
  • @DotNET:我扩大了我的答案。
【解决方案2】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-06
    • 2021-01-11
    • 1970-01-01
    • 2018-01-10
    • 1970-01-01
    • 2016-04-12
    相关资源
    最近更新 更多