【问题标题】:Write quotes round all fields except first (heading) row在除第一(标题)行之外的所有字段中写引号
【发布时间】:2018-11-24 17:32:27
【问题描述】:

CsvHelper 有这个非常方便的标志来设置"" 围绕所有字段(CSV 文件中的常见要求):

csv.Configuration.QuoteAllFields = true;

不过,这也会将" 放在第一行周围,其中包含字段名称。

如何将"" 放在除包含字段名称的第一行之外的所有字段?

我在 Google 上找不到任何东西

【问题讨论】:

  • 你为什么要这样做?
  • 客户要求
  • 显示你用来写文件的全部代码

标签: c# csvhelper


【解决方案1】:

你可以使用这样的东西

cw.Configuration.ShouldQuote = (field, context) => context.HasHeaderBeenWritten;

cw.Configuration.ShouldQuote = (field, context) => context.Row > 1;

但您需要根据需要进行测试和调整。

【讨论】:

    【解决方案2】:

    阅读 csvhelper 的代码,WriteHeader 方法似乎在内部使用了 WriteField,并设置了指示标头已写入的标志。 WriteField 遵循当前配置的关于是否应该引用字段的设置,并且它会将引号烘焙到在调用它时传递的字段数据中,即使当时不一定会写入文件

    因此,我建议您这样做:

    var cw = new CsvWriter(yourTextWriterOrWhatever);
    cw.Configuration.QuoteNoFields = true;
    cw.WriteHeader<YourClassNameHere>();
    cw.NextRecord(); // without this first row is on same line as header
    cw.Configuration.QuoteAllFields = true; //or set QuoteNoFields = false
    cw.WriteRecords(yourCollectionOfYourClass);
    

    只是为了清楚;您无法粘贴并继续上面的代码,您必须对其进行编辑以使其对您的上下文有效 - 在您遇到“您的”一词的任何地方都需要调整。

    我要概述的重要部分是你应该

    • 在配置中关闭引号,
    • 写标题,
    • 打开引用(通过引用所有内容或禁用引用字段并让 csvhelper 确定是否引用)
    • 写入数据记录

    【讨论】:

    【解决方案3】:

    从版本 25.0.0 到现在,实现的方法是:

     new CsvConfiguration(CultureInfo.InvariantCulture)
     {
         ShouldQuote = args => args.Row.HeaderRecord != null,
     };
    

    【讨论】:

      【解决方案4】:

      使用 CsvHelper V27.2.1 可以做到这一点:

       new CsvConfiguration(CultureInfo.InvariantCulture)
                  {
                      HasHeaderRecord = true,
                      ShouldQuote = x => x.Row.Row > 1,
                  };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-09-19
        • 2010-09-27
        • 2018-01-11
        • 2014-09-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多