CsvHelper:使用CsvHelper添加标题

3
我正在使用CsvHelper将dapper对象转换为CsvFiles。我使用classmaps来映射属性到索引和名称。问题是,在记录被写入之前,我需要一个带有表格标题的行,如下所述:

enter image description here

我的旧代码没有标题:
  using (var writer = new StreamWriter(@"C:\Users\NPandian\Desktop\test.csv", false, System.Text.Encoding.UTF8))

        using (var csvWriter = new CsvWriter(writer))
        {
            var ReportName = "Test Class";
            csvWriter.Configuration.RegisterClassMap(classMap);
            csvWriter.WriteRecords(records);
            writer.Close();
        }

旧的 Csv 文件:

输入图像描述

我的当前代码解决方案:

            using (var writer = new StringWriter())
            using (var csvWriter = new CsvWriter(writer))
            {
                var ReportName = "Test Class";
                csvWriter.Configuration.RegisterClassMap(classMap);
                csvWriter.WriteRecords(records);
                writer.Close();
                return $"ReportName:, {ReportName},\n{csvWriter.Context.Writer.ToString()}";
            }

我的问题: 1)CsvHelper能否实现? 2)如果可以,如何实现?


可能是使用CsvHelper编写标题?C#的重复问题。 - nbokmans
1
如果您添加标题,那么CSV文件就不再是纯粹的CSV了。读取该文件的开发人员将会很失望。无论如何,由于标题与CSV数据无关,因此在调用csvWriter.WriteRecords之前,您可以直接向StreamWriter中写入,例如使用writer.WriteLine("Title : {0}",someText); - Panagiotis Kanavos
任何与 CSV 数据无关的内容都不能使用 CSV Helper 进行映射。顺便说一下,它是为人类设计的,我们需要标题来让人们知道他们正在阅读什么。如果有人能确认 CSV Helper 绝对不会计划实现这个功能,我就可以坚持使用解决方法代码。 - Narendran Pandian
@NarendranPandian 代码需要修复。首先,您根本不需要StringWriter,因为您已经有了StreamWriter。 - Panagiotis Kanavos
重点需要放在csvhelper功能上,这在两个代码中是相同的。无论如何,我已经解决了这个问题。 - Narendran Pandian
显示剩余3条评论
3个回答

7
你可以手写字段和行。
void Main()
{
    var records = new List<Foo>
    {
        new Foo { Id = 1, Name = "one" },
        new Foo { Id = 2, Name = "two" },
    };
    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer))
    {
        csv.Configuration.RegisterClassMap<FooMap>();

        csv.WriteField("Title:");
        csv.WriteField("Title");
        csv.NextRecord();

        csv.WriteRecords(records);
        writer.ToString().Dump();
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id).Index(0).Name("S.No.");
        Map(m => m.Name).Index(1);
    }
}

输出:

Title:,Title
S.No.,Name
1,one
2,two

1

CSV文件没有标题。该问题描述的是一个平面文本报告,而不是CSV文件。CsvHelper正如其名称所示,是一个帮助库,用于编写CSV文件,它不是一个完整的报告生成器。

该库允许其他代码在它完成之前或之后写入任意文本,因为它在抽象的上工作,而不是在流或文件上。如果需要,甚至可以在记录之间编写额外的文本。

您可以使用已经拥有的writer在调用csvWriter.WriteRecords(records);之前或之后编写任何您想要的内容,例如:

using (var writer = new StreamWriter(@"C:\Users\NPandian\Desktop\test.csv", false, System.Text.Encoding.UTF8))
using (var csvWriter = new CsvWriter(writer))
{
    var ReportName = "Test Class";
    csvWriter.Configuration.RegisterClassMap(classMap);

    //Doesn't matter where this is called as long as it is before `WriteRecords`
    writer.WriteLine($"ReportName:, {ReportName}");

    csvWriter.WriteRecords(records);

    //No need to explicitly close, that's what `using` is for
}

CsvWriter 接受任何 TextWriter 对象,并将其数据直接写入该 writer。它不会尝试以任何其他方式修改它。它不会影响已经写入该 TextWriter 的任何其他文本。


1

对于CSVHelper版本15.0.0及以上,请使用:

void Main()
{
    var records = new List<Foo>
    {
        new Foo { Id = 1, Name = "one" },
        new Foo { Id = 2, Name = "two" },
    };
    using (var writer = new StringWriter())
    using (var csv = new CsvWriter(writer, CultureInfo.CurrentCulture))
    {
        csv.Configuration.RegisterClassMap<FooMap>();

        csv.WriteField("Title:");
        csv.WriteField("Title");
        csv.NextRecord();

        csv.WriteRecords(records);
        writer.ToString().Dump();
    }
}

public class Foo
{
    public int Id { get; set; }
    public string Name { get; set; }
}

public class FooMap : ClassMap<Foo>
{
    public FooMap()
    {
        Map(m => m.Id).Index(0).Name("S.No.");
        Map(m => m.Name).Index(1);
    }
}

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