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; }
}
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; }
}
Plz try this in latest version, I tried in V28 and its work for me
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
ShouldQuote = (field) => false
};
using (StreamWriter _streamWriter = new StreamWriter(fileNamePath))
{
using (var _csvWriter = new CsvWriter(_streamWriter, config))
{
await _csvWriter.WriteRecordsAsync(models);
}
}
3条答案
按热度按时间j2datikz1#
问题是你试图反对CsvHelper的报价。根据RFC 4180规范。
1.包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。例如:
1.如果使用双引号将字段括起来,则必须在字段内出现的双引号前加上另一个双引号,以对其进行转义。例如:
因此,当您在字段中添加双引号时,CsvHelper会识别出整个字段需要用双引号括起来,并且添加的引号需要用另一个双引号转义,这就是为什么您最终使用了3个双引号。
CsvHelper有一个配置函数,可以告诉它什么时候应该给字段加上引号。@JoshClose已经有一个用双引号括住所有字段的答案here。我将为当前版本的CsvHelper更新它。
如果您仍然希望自己添加双引号,可以关闭CsvHelper的双引号。
版本20.0.0及更高版本的重大变更
已将CsvConfiguration更改为只读记录,以消除线程问题。
您需要创建
CsvConfiguration
,在初始化时设置ShouldQuote
,然后将其传递给CsvWriter
。q8l4jmvw2#
我把firstName赋值给一个变量,使代码更具可读性,这个变量将在以后传递。我使用字符串转义符给最终结果加了一个引号。现在你可以把它传递给你的WriteField方法。
有关字符串转义的详细信息,请参见:here和here。
l7wslrjt3#