Добавление двойных кавычек в строку при записи в csv c# - PullRequest
0 голосов
/ 19 июня 2020

Я пытаюсь записать данные в файл csv. Я хочу, чтобы данные отображались в двойных кавычках при открытии в блокноте, но они не должны отображать двойные кавычки, когда я открываю файл в csv.

ниже приведен код, который я использую, но он не не дает результата.

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

Кто-нибудь может мне помочь с этим?

Ответы [ 2 ]

1 голос
/ 19 июня 2020

Проблема в том, что вы пытаетесь бороться с цитированием CsvHelper. Согласно спецификации RF C 4180 .

Поля, содержащие разрывы строк (CRLF), двойные кавычки и запятые, должны быть заключены в двойные кавычки. Например:
       "aaa","b CRLF
       bb","ccc" CRLF
       zzz,yyy,xxx
Если для заключения полей используются двойные кавычки, то двойные кавычки внутри поля должны быть экранированы, поставив перед ними другую двойную кавычку. Например:
       "aaa","b""bb","ccc"

Поэтому, когда вы добавляете двойные кавычки в поле, CsvHelper распознает, что все поле должно быть заключено в двойные кавычки, а добавленные кавычки должны быть экранированы с помощью еще одна двойная кавычка. Вот почему получается 3 двойные кавычки.

CsvHelper имеет функцию конфигурации, с помощью которой вы можете указать ей, когда следует указать поле в кавычках. @JoshClose уже имеет ответ здесь для заключения всех полей в двойные кавычки. Я обновлю его для текущей версии 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;
0 голосов
/ 19 июня 2020

Я сделал код более читабельным, поместив присвоение firstName переменной, которая будет передана позже. Я использовал escape-последовательность, чтобы добавить кавычку к окончательному результату. Теперь вы можете передать его в свой метод WriteField.

Дополнительную информацию о преобразовании строки можно найти: здесь и здесь .

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