如果我有一些LF
转换(使用N ++)CSV文件,每次我使用JoshClose CsvHelper
向他们写入数据时,行结尾都会回到CRLF。
由于我在SQL Server中遇到CLRF ROWTERMINATORS
的问题,所以我要保留我的行结尾,就像文件的初始状态一样。
无法在文化设置中找到它,我编译了我自己的库版本。
如何进行?
答案 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");
}
}
}