StringBuilder 导出 csv 开头带引号

StringBuilder export csv with quotation marks at the beginning

我想用 StringBuilder 将几行 csv 写入一个 csv 文件。我用引号将每个字段括起来。如果我将文件导出为 .txt,我就得到了我想要的 ("Artist","Album","Track")。 如果我导出为 .csv,则第一个字段未用引号引起来 (Artist,"Album","Track")。一些重现问题的测试代码:

static void Main(string[] args)
{
  StringBuilder csv = new StringBuilder();

  string artist = EncloseComma("Artist");
  string album = EncloseComma("Album");
  string track = EncloseComma("Track");

  string newLine = string.Format("{0},{1},{2}", artist, album, track);
  csv.AppendLine(newLine);
  File.WriteAllText("test.csv", csv.ToString());
}

private static string EncloseComma(string str)
{
  return "\"" + str + "\"";
}

这段代码对我有用:

    private static string AddDoubleQuotes(string str)
    {
        str = $"\"" + "\"" + "\"" + str + "\"" + "\"" + "\"";
        return str;
    }

再添加两个转义字符,如\",总共3个

虽然引号在记事本中可见,但在 Excel 或使用其他 csv 解析器读取时不出现是很正常的。

csv 文件中的引号仅用于括起其中可能有分隔符的字段(它们甚至不意味着该字段应被视为字符串,引号也可以围绕包含分隔符的数字).

要使引号在解析后仍然可见,必须使用另一个引号对其进行转义,然后用引号将其包围以具有带引号的字段,如下所示:

"""Artist""","""Album""","""Track"""

出于同样的原因,从代码生成 csv 文件时,应检查每个字段的分隔符和引号,然后必须使用另一个引号对这些引号进行转义。