编写类似于CSV文件的文件

时间:2019-06-13 16:35:22

标签: csvhelper

我需要解析/写入LEDES 1998B文件。它与CSV非常相似,除了: 1. PIPE字符(|)代替逗号分隔字段。 2. [] \ r \ n代替\ n或\ r \ n结束一行。

我发现我可以使用:

        var Configuration = new CsvHelper.Configuration.Configuration();
        Configuration.Delimiter = "|";

设置定界符。

如何设置NewLine / EndOfRecord字符?

1 个答案:

答案 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);
    }
}