【问题标题】:How to exclude header when writing data to CSV将数据写入 CSV 时如何排除标题
【发布时间】:2019-03-25 06:51:19
【问题描述】:

我正在将我的数据从 public class 写入 CSV 文件。因为我想附加我的数据,所以我想排除标题的导入,只从类中导入数据。我下面的代码同时导入标题和数据。希望得到帮助。谢谢。

Record.cs - 我的班级

public class Record
{
    public string Name
    {
        get; set;
    }

    public DateTime DateOfBirth
    {
        get; set;
    }
}

Form1.cs - 我的表单

public partial class Form1 : Form
{
    private List<Record> records;

    public Form1()
    {
        InitializeComponent();
        records = new List<Record>();
    }

    private void Savetocsv_Click(object sender, EventArgs e)
    {
        var myDocument = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
        using (var writer = new StreamWriter(myDocument + "/my-data.csv", append: true))
        {
            using (var csv = new CsvWriter(writer))
            {
                csv.WriteRecords(records);
            }                
        }
    }

【问题讨论】:

  • 什么是 CsvWriter?
  • @RistoM。嗨,这是一项有助于将数据写入 CSV 的功能。当程序使用可作为 NuGet 包安装的 CSVHelper 时,此功能可用。
  • 通过编写器配置,您应该能够说出是否需要标题joshclose.github.io/CsvHelper/api/CsvHelper.Configuration/…
  • 或者简单地循环记录和没有 S 的 WriteRecord。这个不做标题。

标签: c# winforms csvhelper


【解决方案1】:

使用Configuration,您可以使用属性HasHeaderRecord

HasHeaderRecord : 获取或设置一个值,该值指示 CSV 文件是否具有标题记录。
默认为真。

var records = new List<Foo>
{
    new Foo { Id = 1, Name = "one" },
    new Foo { Id = 1, Name = "one" },
};

using (var writer = new StreamWriter($"file.csv"))
using (var csv = new CsvWriter(writer, new Configuration { HasHeaderRecord = false }))
{
    csv.WriteRecords(records);
}

结果文件:“file.csv”

1;一个
1;一个

或者简单地循环记录并写入它们:

var records = new List<Foo>
{
    new Foo { Id = 1, Name = "one" },
    new Foo { Id = 1, Name = "one" }
};

using (var writer = new StreamWriter($"file.csv"))
using (var csv = new CsvWriter(writer))
{
    foreach (var record in records)
    {
        csv.WriteRecord(record);
        csv.NextRecord();
    }
}

【讨论】:

    【解决方案2】:

    配置类的名称已更改。

    using (var csv = new CsvWriter(outputStream, new CsvConfiguration(CultureInfo.InvariantCulture)
    {
        HasHeaderRecord = false
    }))
    

    【讨论】:

      【解决方案3】:

      改变你的写作方法如下,然后CsvHelper.WriterConfiguration 做这个伎俩(注意HasHeaderRecord):

      private void Savetocsv_Click(object sender, EventArgs e)
      {
          var myDocument = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
          using (var writer = new StreamWriter(myDocument + "/my-data.csv", append: true))
          {
              using (var csv = new CsvWriter(writer, new Configuration { HasHeaderRecord = false }))
              {
                  csv.WriteRecords(records);
              }                
          }
      }
      

      【讨论】:

        【解决方案4】:

        我不知道您使用的是哪个 CsvWriter,但 here 有一个 HasHeaderRecord 属性,您可以使用它来忽略或包含标题。

        private void Savetocsv_Click(object sender, EventArgs e)
        {
            var myDocument = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
            using (var writer = new StreamWriter(myDocument + "/my-data.csv", append: true))
            {
                using (var csv = new CsvWriter(writer))
                {
                    csv.Configuration.HasHeaderRecord = true;
                    csv.WriteRecords(records);
                }               
            }
        } 
        

        【讨论】:

          【解决方案5】:

          在调用之前从records 中删除第一行:

          csv.WriteRecords(records);
          

          (如果您需要保持记录不变,请在调用 WriteRecords(...) 后重新添加标题。)

          private void Savetocsv_Click(object sender, EventArgs e)
          {
              var myDocument = Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments);
              using (var writer = new StreamWriter(myDocument + "/my-data.csv", append: true))
              {
                  using (var csv = new CsvWriter(writer))
                  {
                      records.RemoveAt(0);  // Removes the header row.
                      csv.WriteRecords(records);
                  }                
              }
          }
          

          【讨论】:

          • 您好,感谢您的建议。您的回答将删除第一个数据,但不会删除标题。因此,如果我有两组数据,CSV 文件将打印出标题和第二组数据。
          • 我添加了第二个答案,希望对您有所帮助。
          猜你喜欢
          • 1970-01-01
          • 2019-05-14
          • 1970-01-01
          • 2018-03-21
          • 1970-01-01
          • 1970-01-01
          • 2018-05-15
          • 1970-01-01
          • 2019-06-24
          相关资源
          最近更新 更多