【问题标题】:Enforce LF line endings with CsvHelper使用 CsvHelper 强制 LF 行结尾
【发布时间】:2015-04-09 19:18:16
【问题描述】:

如果我有一些 LF 转换(使用 N++)CSV 文件,每次我使用 JoshClose 的 CsvHelper 向它们写入数据时,行尾都会返回到 CRLF。

由于我在 SQL Server 中遇到 CLRF ROWTERMINATORS 的问题,我希望保留我的行结尾,就像文件的初始状态一样。

在文化设置中找不到它,我编译了我自己的库版本。

如何进行?

【问题讨论】:

    标签: c# asp.net csv line-endings csvhelper


    【解决方案1】:

    使用 CsvHelper 时缺少或不正确的 Newline 字符是一个常见问题,这是一个简单但记录不充分的解决方案。此 SO 问题的其他答案是正确的,但缺少一个重要细节。

    配置允许您从四种可用选项中进行选择:

    // Pick one of these alternatives
    CsvWriter.Configuration.NewLine = NewLine.CR;   
    CsvWriter.Configuration.NewLine = NewLine.LF;
    CsvWriter.Configuration.NewLine = NewLine.CRLF;
    CsvWriter.Configuration.NewLine = NewLine.Environment;
    

    但是,许多人被以下事实绊倒了:(根据设计)CsvWriter 在使用CsvWriter.WriteHeader() 编写标题或使用CsvWriter.WriteRecord() 编写单个记录时不会发出任何换行符。原因是您可以编写额外的标题元素或额外的记录元素,当您的标题和行数据来自两个或多个类而不是单个类时,您可能会这样做。

    CsvWriter 确实在您调用 CsvWriter.NextRecord() 时发出定义类型的换行符,并且作者 JoshClose 指出您应该在完成标头之后调用 NextRecord()您已完成使用WriteRecord 添加的每一行。 See GitHub Issues List 929

    当您使用WriteRecords() 写入多条记录时,CsvWriter 会在每条记录的末尾自动发出定义类型的换行符。

    在我看来,这应该有更好的记录,但确实如此。

    【讨论】:

    • 现在是 2020 年,CsvHelper 的文档仍然缺乏重要信息和各种样本。如果使用 CsvWriter.WriteRecord(),我遇到了同样的问题,即标题和内容在一行上。 CsvWriter.NextRecord() 解决了它!多亏了你,不再有脑细胞死于它了 :)
    • 更令人困惑的是,CsvWriter.Flush() 声明 Serializes the row to the TextWriter.,这似乎表明 行 已完成。如果此方法信息提示您应该调用 NextRecord() 来编写 NewLine 字符,将会很有帮助。
    【解决方案2】:

    从 CsvHelper 13.0.0 开始,line-endings are now configurable 通过 NewLine 配置属性。

    例如:

    using CsvHelper;
    using CsvHelper.Configuration;
    using System.Globalization;
    
    void Main()
    {
        using (var writer = new StreamWriter(@"my-file.csv"))
        {
            using (var csv = new CsvWriter(writer, CultureInfo.InvariantCulture))
            {
                csv.Configuration.HasHeaderRecord = false;
                csv.Configuration.NewLine = NewLine.LF; // <<####################
    
                var records = new List<Foo>
                {
                    new Foo { Id = 1, Name = "one" },
                    new Foo { Id = 2, Name = "two" },
                };
    
                csv.WriteRecords(records);
            }
        }
    }
    
    private class Foo
    {
        public int Id { get; set; }
        public string Name { get; set; }
    }
    

    【讨论】:

    • 这适用于记录之间,但你可以在标题和第一条记录之间换行吗?
    • @RickyTad 我不确定我是否理解你的问题。上面的示例代码确实在写入标题后插入了一个新行:header\nrecord1\nrecord2 等
    【解决方案3】:

    可能对某人有用:

        public static void AppendToCsv(ShopDataModel shopRecord)
        {
            using (var writer = new StreamWriter(DestinationFile, true))
            {
                using (var csv = new CsvWriter(writer))
                {
                    csv.WriteRecord(shopRecord);
                    writer.Write("\n");
                }
            }
        }
    

    【讨论】:

      【解决方案4】:

      据我所知,行终止符不受 CvsHelper 控制。我已经通过调整传递给 CsvWriter 的文件编写器来使其工作。

      TextWriter tw = File.CreateText(filepathname);
      tw.NewLine = "\n";
      CsvWriter csvw = new CsvWriter(tw);
      csvw.WriteRecords(records);
      csvw.Dispose();
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-11-22
        • 1970-01-01
        • 2021-09-06
        • 2020-10-16
        • 2011-04-22
        • 2011-01-31
        • 1970-01-01
        相关资源
        最近更新 更多