我需要解析/写入LEDES 1998B文件。它与CSV非常相似,除了: 1. PIPE字符(|)代替逗号分隔字段。 2. [] \ r \ n代替\ n或\ r \ n结束一行。
我发现我可以使用:
var Configuration = new CsvHelper.Configuration.Configuration();
Configuration.Delimiter = "|";
设置定界符。
如何设置NewLine / EndOfRecord字符?
答案 0 :(得分:1)
我相信您可以在传递给TextWriter
的特定CsvWriter
上进行设置
var records = new List<Foo>
{
new Foo { Id = 1, Name = "one" },
new Foo { Id = 2, Name = "two" },
};
using (var writer = new StreamWriter("path\\to\\file.csv"))
using (var csv = new CsvWriter(writer))
{
writer.NewLine = "[]\r\n";
csv.Configuration.Delimiter = "|";
csv.WriteRecords(records);
}
我刚刚意识到阅读将变得更加困难。您无法在Newline
上设置TextReader
。您可能会重写CsvParser
,但这是很多工作。这是一个可能的解决方法,但它不那么灵活。假设您知道最后一列是什么,并且标题中没有“ []”。
using (var reader = new StreamReader("path\\to\\file.csv"))
using (var csv = new CsvReader(reader))
{
csv.Configuration.Delimiter = "|";
csv.Configuration.PrepareHeaderForMatch = (header, index) => header.Replace("[]", "");
csv.Configuration.RegisterClassMap(new FooMap());
var records = csv.GetRecords<Foo>().ToList();
}
public class Foo
{
public int Id { get; set; }
public string Name { get; set; }
public int NewId { get; set; }
}
public class FooMap : ClassMap<Foo>
{
public FooMap()
{
AutoMap();
Map(m => m.NewId).TypeConverter<RemoveEndBracketsConverter>();
}
}
public class RemoveEndBracketsConverter : Int32Converter
{
public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
{
if (text.Length >= 2 && text.Substring(text.Length - 2) == "[]")
{
text = text.Substring(0, text.Length - 2);
}
return base.ConvertFromString(text, row, memberMapData);
}
}