问题是你试图对抗 CsvHelper 的引用。根据RFC 4180 规范。
- 包含换行符 (CRLF)、双引号和逗号的字段
应该用双引号括起来。例如:
"aaa","b CRLF
bb","ccc" CRLF
zzz,yyy,xxx
- 如果使用双引号将字段括起来,则使用双引号
出现在字段内必须通过在它前面加上
另一个双引号。例如:
"aaa","b""bb","ccc"
所以当你在字段中添加双引号时,CsvHelper 会识别出整个字段需要用双引号括起来,并且添加的引号需要用另一个双引号进行转义。这就是为什么你最终会使用 3 个双引号。
CsvHelper 有一个配置函数,你可以告诉它何时应该引用一个字段。 @JoshClose 已经有一个答案 here 用于将所有字段括在双引号中。我会为当前版本的 CsvHelper 更新它。
void Main()
{
var records = new List<Foo>
{
new Foo { Id = 1, Name = "one" },
new Foo { Id = 2, Name = "two" },
};
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
{
csv.Configuration.ShouldQuote = (field, context) => true;
csv.WriteRecords(records);
writer.ToString().Dump();
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}
如果您仍想自己添加双引号,可以关闭 CsvHelper 的双引号。
csv.Configuration.ShouldQuote = (field, context) => false;
20.0.0 及更高版本的重大更改
Changed CsvConfiguration to a read only record to eliminate threading issues.
您需要创建CsvConfiguration,在初始化时设置ShouldQuote,然后将其传递给CsvWriter。
void Main()
{
var records = new List<Foo>
{
new Foo { Id = 1, Name = "one" },
new Foo { Id = 2, Name = "two" },
};
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
ShouldQuote = (field, context) => true
};
using (var writer = new StringWriter())
using (var csv = new CsvWriter(writer, config))
{
csv.WriteRecords(records);
writer.ToString().Dump();
}
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
}