当我试图在C#中避开双引号时,我得到的是多个引号,而不是一个引号

当我试图在C#中避开双引号时,我得到的是多个引号,而不是一个引号,c#,csv,C#,Csv,在我的程序中,我需要从CSV文件中读入数据,对其进行处理,然后根据读入的数据创建一批新的CSV文件。如果有什么不同的话,我正在使用图书馆 除了一个部分外,该程序工作正常。我需要我的输出CSV文件将每个字段用双引号括起来。通常我只会使用c#的逃逸机制,但我遇到了一个我似乎无法解决的奇怪问题。每当我试图逃避一个“标记”,我最终得到的不仅仅是一个 所需输出示例: date_start,date_end,current_year "2017-08-01","2018-06-20","2017" "201

在我的程序中,我需要从CSV文件中读入数据,对其进行处理,然后根据读入的数据创建一批新的CSV文件。如果有什么不同的话,我正在使用图书馆

除了一个部分外,该程序工作正常。我需要我的输出CSV文件将每个字段用双引号括起来。通常我只会使用c#的逃逸机制,但我遇到了一个我似乎无法解决的奇怪问题。每当我试图逃避一个“标记”,我最终得到的不仅仅是一个

所需输出示例:

date_start,date_end,current_year
"2017-08-01","2018-06-20","2017"
"2017-08-01","2018-06-20","2017"
观测输出:

date_start,date_end,current_year
"""2017-08-01""","""2018-06-20""","""2017"""
"""2017-08-01""","""2018-06-20""","""2017"""
当我正在寻找一个双引号时,它会加入一对双引号。我在网上四处寻找,并尝试了几种不同的方法来尝试只获得一个双引号,但我似乎无法使其工作。以下是相关代码和我尝试过的不同方法:

HashSet<CustomDataWrapper> hs = new HashSet<CustomDataWrapper>();

foreach (CustomDataType record in records) {
string quote = "\"";
String method1 = (String)(record.date_start);
String method2 = quote + record.date_start + quote;
String method3 = "\"" + record.date_start + "\"";
String method4 = "\U0022" + record.date_start + "\U0022"

hs.Add(data);
}

csvWriter.WriteRecords(hs);

任何帮助都将不胜感激。谢谢!

以下是发生的情况。让我们从以下代码开始:

var records = new []
{
    new { H1 = "Foo", H2 = "Bar" },
    new { H1 = "Qaz", H2 = "Waz" }
};

using (var tw = new System.IO.StringWriter())
{
    using (var cw = new CsvHelper.CsvWriter(tw))
    {
        cw.WriteRecords(records);
        var output = tw.ToString();
        Console.WriteLine(output);
    }
}
如果运行该命令,我将获得以下输出:

date_start,date_end,current_year
"2017-08-01""","2018-06-20""","2017"""
"2017-08-01""","2018-06-20""","2017"""
H1,H2 Foo,Bar Qaz,Waz …然后输出变为:

H1,H2 Foo,Bar "Qaz""",Waz H1,H2 富,酒吧 “Qaz”,Waz
库知道可以输出双引号作为数据的一部分,然后它必须将整个字段用双引号括起来它必须在字段中转义双引号,将单个
转换为

停止向字段添加引号。尝试创建配置对象,并将“QuoteAllFields”设置为true,然后将此对象传递给CSVWriter,如下所示

var config = new CsvHelper.Configuration.CsvConfiguration();
config.QuoteAllFields = true;

using (var csvReader = new CsvHelper.CsvReader(streamReader, config))
{
}

希望这能起作用。

在CSV中,如果您希望双引号成为数据的一部分,则必须按照您看到的那样将其加倍。这是正确的。如果您想要不包含引号的字符串,请不要向数据中添加引号。根据CSV格式的大多数“标准”定义,不需要这些引号。而您的库选择忽略它们。当字符串中有任何必须被引用的字符(如引号或逗号)时,库将对其进行引用。但是你有一个特别不受欢迎的特殊性格。我一定是误解了这个问题;使用我不观察任何“额外”引用,因此,在不更改数据的情况下,唯一有效的方法是找出如何要求库输出不必要的引用。这可能需要切换到另一个库,如果它在这个库中不可配置的话。但是我看到
quotealFields
打开,您应该尝试将其设置为true。@sab669是CSV编写器在写额外的引号。你的小提琴没有写CSV。谢谢!我不知道CsvHelper是额外引号的来源。我现在已经把它修好了,非常感谢。@andyrichterr-如果答案有帮助,那么请勾选为接受答案。是的,这是我需要的,以便它按预期工作。非常感谢。
var config = new CsvHelper.Configuration.CsvConfiguration();
config.QuoteAllFields = true;

using (var csvReader = new CsvHelper.CsvReader(streamReader, config))
{
}