【问题标题】:Export to CSV - How to write values which contain commas? c# [duplicate]导出到 CSV - 如何写入包含逗号的值? c# [重复]
【发布时间】:2021-02-08 06:24:15
【问题描述】:

我目前有一个用于导出到 csv 文件的字符串生成器。 CSV 文件中导出的值在 somw 值中包含逗号。

有时数据包含一个“,”导致它生成不正确。

public string ExportActionMapAsCsv()
    {
        StringBuilder builder = new StringBuilder(",");
        List<EggEmbryoActivity> actions = GetActions();
        List<EggStatusActionMap> actionMaps = GetActionMaps();

        builder.AppendLine(string.Join(",", actions.Select(x => x.Title)));

        foreach (EggStatusActionMap actionMap in actionMaps)
        {
            builder.Append(actionMap.StatusDescription);
            builder.Append(",");
            builder.AppendLine(string.Join(",", actionMap.ActionMaskAsBinary.PadLeft(actions.Count, '0').ToCharArray()));
        }

        return builder.ToString();
    }

生成导出,但是如何在单列中显示带有逗号的数据

【问题讨论】:

  • 使用 csv 需要考虑很多事情,除非您希望自己做,否则您可以使用 nuget 上提供的库,例如 csvhelper。当你在一个值中有一个额外的 columnCharacter 时,你会用 wrappingCharacter 包装它们,然后捕获 wrappingCharacter 的用法并转义那个

标签: c# export-to-csv stringbuilder


【解决方案1】:

您需要在要放置逗号的字符串中添加引号

     foreach (EggStatusActionMap actionMap in actionMaps)
     {
         builder.Append("\"" + neutralizeInput(actionMap.StatusDescription) + "\"");
         builder.Append(",");
         builder.AppendLine("\"" + neutralizeInput(string.Join(",", actionMap.ActionMaskAsBinary.PadLeft(actions.Count, '0').ToCharArray())) + "\"");
     }

     private string neutralizeInput(string input){
         return input.replace("\"", "\"\"")
     }

【讨论】:

  • 如果字符串已经包含"怎么办?
  • 你能回答 Enigmativity 的问题吗?
  • 我一直在搜索,要在需要编辑的内容中加上引号,从“到”
【解决方案2】:

我非常倾向于创建一个将字符串转换为有效 CSV 字段的扩展方法。

如果字段包含逗号或包含双引号,则必须将其括在双引号中,并且任何双引号必须在字符串中重复。

扩展方法如下:

public static class Ex
{
    public static string ToCsvSafeField(this string field) =>
        (field.Contains(',') || field.Contains('"'))
            ? $"\"{field.Replace("\"", "\"\"")}\""
            : field;
}

然后我会像这样重写代码:

foreach (EggStatusActionMap actionMap in actionMaps)
{
    var items =
        actionMap
            .ActionMaskAsBinary
            .PadLeft(actions.Count, '0')
            .ToCharArray()
            .Select(x => x.ToString().ToCsvSafeField())
            .StartWith(actionMap.StatusDescription.ToCsvSafeField());
            
    builder.AppendLine(string.Join(",", items));
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-12-26
    • 1970-01-01
    • 1970-01-01
    • 2021-01-24
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    相关资源
    最近更新 更多