使用CsvHelper强制执行LF行结尾

时间:2015-02-09 21:54:11

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

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

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

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

如何进行?

4 个答案:

答案 0 :(得分:8)

据我所知,行终止符不受CvsHelper控制。我通过调整传递给CsvWriter的文件编写器来实现它。

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

答案 1 :(得分:5)

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

配置允许您从四个可用的替代方法之一中进行选择:

// 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()编写标题时或在您使用{{ 1}}。原因是您可以编写其他标头元素或其他记录元素,就像您的标头和行数据来自两个或多个类而不是来自单个类一样。

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

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

我认为应该对此做更好的记录,但是确实有。

答案 2 :(得分:3)

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

答案 3 :(得分:0)

对某人可能有用:

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