【问题标题】:Writing a file that is similar to a CSV file编写类似于 CSV 文件的文件
【发布时间】:2019-06-13 16:35:22
【问题描述】:

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

我发现我可以使用:

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

设置分隔符。

如何设置 NewLine/EndOfRecord 字符?

【问题讨论】:

    标签: csvhelper


    【解决方案1】:

    我相信您可以在传递给 CsvWriter 的特定 TextWriter 上设置它

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

    我刚刚意识到阅读将变得更加困难。您不能在TextReader 上设置Newline。您可能会重写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);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多