如何解决CsvHelper 只是为类列表编写标题
此处和 CsvHelper 的文档中有许多使用 CsvHelper 编写 CSV 的示例。没有人帮我写一个类列表
列表是这些对象的
#include <Registry.hpp>
TRegistry *Reg = new TRegistry;
String buf;
Reg->RootKey = ...;
if (Reg->OpenKeyReadOnly(_D("...")))
{
buf = Reg->ReadString(_D("Nazwa"));
Reg->CloseKey();
}
delete Reg;
这个
class Contract
{
public Contract()
{
Id = "None";
Type = "";
FileNames = new List<string>();
}
public string Id { get; set; }
public string Type { get; set; }
public List<String> FileNames { get; set; }
public override string ToString()
{
string result = "Contract:ID " + Id
+ ",Type " + Type
+ ",FileNames ";
foreach (string FileName in FileNames)
{
result = result + FileName + ",";
}
return result;
}
}
只带回没有合同列表的标题。如何正确地将合约列表写成 csv ?
解决方法
所提出的问题是,正如 user nilsK in a comment 所指出的,在写入标头后代码丢失了 csv.NextRecord();
。
此外,您似乎也想将文件名写入 CSV 文件。由于 CsvHelper 不会直接为您编写 List<string>
,您可以向它可以编写的 Contract
类添加另一个属性。
最好用一个不会出现在文件名中的字符来分隔文件名,例如分号。
using CsvHelper;
using CsvHelper.Configuration;
using CsvHelper.TypeConversion;
using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using System.Linq;
using System.Text;
namespace CsvWrite
{
public class Program
{
public class ContractMap : ClassMap<Contract>
{
public ContractMap()
{
Map(m => m.Id).Index(0).Name("Id");
Map(m => m.Type).Index(1).Name("Type");
Map(m => m.FileNames).Index(2).Name("Filenames");
}
}
public class Contract
{
public string Id { get; set; }
public string Type { get; set; }
public List<String> FileNames { get; set; }
public string Filenames { get => string.Join(";",FileNames); }
public Contract()
{
Id = "None";
Type = "";
FileNames = new List<string>();
}
public override string ToString()
{
return "Contract:ID " + Id
+ ",Type " + Type
+ ",FileNames " + string.Join(',',FileNames);
}
}
public static void SaveCsv(string PathCsv,List<Contract> contracts)
{
Console.WriteLine("Save Contracts to " + PathCsv);
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";",Encoding = Encoding.UTF8
};
using (var writer = new StreamWriter(PathCsv))
using (var csv = new CsvWriter(writer,config))
{
csv.WriteRecords(contracts);
}
}
static void Main(string[] args)
{
var contracts = new List<Contract>();
contracts.Add(new Contract { Type = "A",Id = "1"});
contracts.Add(new Contract { Type = "BB",Id = "100",FileNames = new List<string> { "F1","F2" } });
contracts.Add(new Contract { Type = "CCC",Id = "1111","F2","F3","F4","F5","F6","F7","F8","F9","F10" } });
string f = @"C:\temp\SaveCsv.csv";
SaveCsv(f,contracts);
}
}
}
输出:
Id;Type;Filenames
1;A;
100;BB;"F1;F2"
1111;CCC;"F1;F2;F3;F4;F5;F6;F7;F8;F9;F10"
,
如果你知道文件名的数量,你可以让它像这样写出标题,使用带有开始和结束索引的 ClassMap
和 .Index()
。
Id;Type;FileName1;FileName2;FileName3
void Main()
{
var records = new List<Contract>
{
new Contract { Id = "First",Type = "MyType",FileNames = new List<string> {"one","two","three"} },new Contract { Id = "Second",Type = "MyOtherType",FileNames = new List<string> {"four","five","six"} }
};
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = ";",Encoding = Encoding.UTF8
};
//using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(Console.Out,config))
{
csv.Context.RegisterClassMap<ContractMap>();
csv.WriteRecords(records);
}
}
class ContractMap : ClassMap<Contract>
{
public ContractMap()
{
Map(x => x.Id);
Map(x => x.Type);
Map(x => x.FileNames).Name("FileName").Index(3,5);
}
}
class Contract
{
public Contract()
{
Id = "None";
Type = "";
FileNames = new List<string>();
}
public string Id { get; set; }
public string Type { get; set; }
public List<String> FileNames { get; set; }
public override string ToString()
{
string result = "Contract:ID " + Id
+ ",Type " + Type
+ ",FileNames ";
foreach (string FileName in FileNames)
{
result = result + FileName + ",";
}
return result;
}
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。