.net 在写入csv c#时向字符串添加双引号

wztqucjr  于 2023-01-22  发布在  .NET
关注(0)|答案(3)|浏览(217)

我正在尝试将数据写入csv文件。我希望在记事本中打开时数据显示在双引号中,但在csv中打开文件时不应显示任何双引号。
下面是我正在使用的代码,但是它没有给予结果。

csvFile.WriteField("\"" +data.FirstName == null ? string.Empty : data.FirstName + "\"");

有人能帮我一下吗?

j2datikz

j2datikz1#

问题是你试图反对CsvHelper的报价。根据RFC 4180规范。
1.包含换行符(CRLF)、双引号和逗号的字段应该用双引号括起来。例如:

"aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx

1.如果使用双引号将字段括起来,则必须在字段内出现的双引号前加上另一个双引号,以对其进行转义。例如:

"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及更高版本的重大变更

已将CsvConfiguration更改为只读记录,以消除线程问题。
您需要创建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; }
}
q8l4jmvw

q8l4jmvw2#

我把firstName赋值给一个变量,使代码更具可读性,这个变量将在以后传递。我使用字符串转义符给最终结果加了一个引号。现在你可以把它传递给你的WriteField方法。
有关字符串转义的详细信息,请参见:herehere

var firstName = data.FirstName == null ? string.Empty : data.FirstName;
var firstNameWithQuoutes = $@"""{firstName}""";
l7wslrjt

l7wslrjt3#

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

相关问题