CsvHelper : 使用 CsvHelper 添加标题
CsvHelper : Adding a title using CsvHelper
我正在使用 CsvHelper 将 dapper objects 转换为 CsvFiles。我正在使用类映射来映射索引和名称映射的属性。问题是我需要 一行带有 table 标题 的记录,然后按如下所述写入记录:
我没有标题的旧代码:
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) 如果是如何?
CSV 文件没有标题。该问题描述的是纯文本报告,而不是 CSV 文件。 CsvHelper,顾名思义,是一个编写 CSV 的帮助程序库,它不是一个功能齐全的报告生成器。
该库允许其他代码在完成之前或之后写入任意文本,因为它在抽象 TextWriter
而不是流或文件之上工作。如果需要,甚至可以在记录之间写入额外的文本。
您可以使用 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
object 并将其数据写入该写入器。它不会尝试以任何其他方式修改它。它不会影响已经写入 TextWriter
的任何其他文本
您可以手写字段和行。
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
对于 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);
}
}
我正在使用 CsvHelper 将 dapper objects 转换为 CsvFiles。我正在使用类映射来映射索引和名称映射的属性。问题是我需要 一行带有 table 标题 的记录,然后按如下所述写入记录:
我没有标题的旧代码:
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) 如果是如何?
CSV 文件没有标题。该问题描述的是纯文本报告,而不是 CSV 文件。 CsvHelper,顾名思义,是一个编写 CSV 的帮助程序库,它不是一个功能齐全的报告生成器。
该库允许其他代码在完成之前或之后写入任意文本,因为它在抽象 TextWriter
而不是流或文件之上工作。如果需要,甚至可以在记录之间写入额外的文本。
您可以使用 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
object 并将其数据写入该写入器。它不会尝试以任何其他方式修改它。它不会影响已经写入 TextWriter
您可以手写字段和行。
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
对于 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);
}
}