如果我有一些LF
转换的(使用 N++)CSV 文件,每次我使用 JoshClose 向它们写入数据时CsvHelper
,行尾都会返回到 CRLF。
由于我ROWTERMINATORS
在 SQL Server 中遇到了 CLRF 问题,因此我希望保留我的行尾,就像文件的初始状态一样。
在文化设置中找不到它,我编译了我自己的库版本。
如何进行?
如果我有一些LF
转换的(使用 N++)CSV 文件,每次我使用 JoshClose 向它们写入数据时CsvHelper
,行尾都会返回到 CRLF。
由于我ROWTERMINATORS
在 SQL Server 中遇到了 CLRF 问题,因此我希望保留我的行尾,就像文件的初始状态一样。
在文化设置中找不到它,我编译了我自己的库版本。
如何进行?
Newline
使用 CsvHelper 时缺少或不正确的字符是一个简单但记录不充分的解决方案的常见问题。此 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
。 请参阅 GitHub 问题列表 929
当您使用WriteRecords()
CsvWriter 编写多条记录时,会在每条记录的末尾自动发出定义类型的换行符。
在我看来,这应该有更好的记录,但它确实存在。
据我所知,行终止符不受 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 开始,行尾现在可以通过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; }
}