使用 CsvHelper 强制 LF 行结尾

Enforce LF line endings with CsvHelper

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

由于我在 SQL 服务器中遇到 CLRF ROWTERMINATORS 问题,我希望保持我的行结尾像文件的初始状态。

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

如何进行?

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

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

可能对某人有用:

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

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

使用 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() 编写 header 时不发出任何换行符使用 CsvWriter.WriteRecord() 的单个记录。原因是您可以编写额外的 header 元素或额外的记录元素,就像当您的 header 和行数据来自两个或多个 classes 而不是来自单个class.

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

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

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