如何在将数据写入CSV时排除标题行

10

我正在将我的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是什么? - Risto M
1
@RistoM。你好,这是一个帮助将数据写入CSV的功能。当程序使用可以作为NuGet包安装的CSVHelper时,此功能可用。 - musa
使用写入器配置,您应该能够指定是否需要标题 https://joshclose.github.io/CsvHelper/api/CsvHelper.Configuration/IWriterConfiguration/ - xdtTransform
或者简单地循环记录并写入记录而不使用S。这个不包括标题。 - xdtTransform
5个回答

12

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

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

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;one
1;one

或者直接循环记录并将其写入:

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();
    }
}

8
配置类的名称已更改。
using (var csv = new CsvWriter(outputStream, new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = false
}))

1

按照以下方式更改您的写作方法,然后 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);
        }                
    }
}

1
我不知道你在使用哪个CsvWriter,但 这里 的CsvWriter有一个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);
        }               
    }
} 

0

在调用之前,从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文件将打印出标题和第二组数据。 - musa
我添加了第二个答案,希望它会更有帮助。 - Eric McLachlan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接