【问题标题】:c# CsvWriter no header for first object and header for second objectc# CsvWriter 没有第一个对象的标题和第二个对象的标题
【发布时间】:2020-06-23 12:30:39
【问题描述】:

这是 CSV 配置

 public static CsvConfiguration CreateConfiguration()
    {
        return new CsvConfiguration(CultureInfo.InvariantCulture)
        {
            SanitizeForInjection = false,
            HasHeaderRecord = true,
            Delimiter = ","
        };
    }

我需要创建一个包含两个对象的 CSV 文件,首先我不需要写标题,但我需要第二个写标题。

 csvWriter.WriteRecords(firstObject); //just a text line
 csvWriter.WriteHeader<secondObjects>();
 csvWriter.NextRecord();
 csvWriter.WriteRecords(secondObjects);

如果我使用属性 [Ignore],那么我有两个空行。

【问题讨论】:

  • 使用 NextRecord 跳过第一行。
  • 因为当我运行这一行 csvWriter.WriteRecords(firstObject); 时,我在配置上有 HasHeaderRecord = true //只是一个文本行,它会自动将 firstObject 的标题写入我,我不希望这个标题在文件中
  • 我从不使用图书馆。我可以在不添加库的情况下轻松地在 c# 中完成它,并且当库不起作用时也不会感到头疼。很多人都有图书馆的问题。每次我建议不要使用该库时,我都会得到很多负面的 cmets。

标签: c# csv


【解决方案1】:

如果没有适当的 [Mre],这个问题有点不清楚。
但它似乎归结为:

  • 如何不写带有配置HasHeaderRecord=true的Header?
  • 如何编写带有配置HasHeaderRecord=false的Header?

1/。 HasHeaderRecord=true

使用此配置WriteRecords 将写入标题。 这是预期的行为:
你想写一个集合的所有元素,配置告诉你有一个标题,所以你会在元素之前写一个标题。

但是WriteRecord 不会。不为每条记录写标题是合乎逻辑的。

foreach(var item in records){
    csv.WriteRecord(item);  
    csv.NextRecord();
}

LiveDemo


重要提示:
WriteRecordsWriteRecord,注意s
实际上是 Write_All_Records vs Write_One_Record


2/. HasHeaderRecord=false

另一种方法是不自动写入标题并使用csv.WriteField("FieldName")以编程方式进行。

//Write the Header
csv.WriteField("C");        
csv.WriteField("D");
csv.NextRecord();

csv.WriteRecords(datas);

LiveDemo

【讨论】:

  • 谢谢,我使用 HasHeaderRecord=false 解决了我的问题(我使用反射来获取对象名称)
  • @alex,我不喜欢反思。这就是为什么我把这个放在Sencond。因为我觉得简单地枚举 Item 比枚举 Properties 名称更容易。特别是因为您丢失了所有 CsvHelper 命名和映射配置。您必须确保以 CsvHelper 写入行的相同顺序枚举属性。
  • 第一个解决方案看起来更健壮、更容易。你检查过现场演示吗?我的代码可能比我的英文更清晰。
  • 是的,我知道反射不是一个好的解决方案,我会努力寻找更好的解决方案
  • 将 header 设置为 true,使用 WriteRecord(xyz)NextRecord() 用于没有 header 的那个。而WriteHeader&lt;type&gt; 是带有标题的那个。这不是关于糟糕的反射,而是关于 Csv 辅助映射功能。使用反射很难以不同的顺序编写标题,例如joshclose.github.io/CsvHelper/examples/configuration/class-maps/…。具有与属性名称joshclose.github.io/CsvHelper/examples/configuration/class-maps/… 不匹配的名称。使用不同的名称多次写入相同的属性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-14
  • 2015-02-19
  • 2020-12-26
  • 1970-01-01
相关资源
最近更新 更多