如果我有一些经过N++转换的LF
CSV文件,每次使用JoshClose的CsvHelper
向它们写入数据时,行尾将回到CRLF。
由于我在SQL Server中遇到了CLRF ROWTERMINATORS
问题,我希望保持我的行尾与文件的初始状态相同。
在文化设置中找不到它,我编译了自己版本的库。
如何继续?
如果我有一些经过N++转换的LF
CSV文件,每次使用JoshClose的CsvHelper
向它们写入数据时,行尾将回到CRLF。
由于我在SQL Server中遇到了CLRF ROWTERMINATORS
问题,我希望保持我的行尾与文件的初始状态相同。
在文化设置中找不到它,我编译了自己版本的库。
如何继续?
使用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.WriteHeader()
写标题时,CsvWriter
不会发出任何换行符,也不会在使用CsvWriter.WriteRecord()
写入单个记录时发出任何换行符。原因是您可以写入其他标题元素或其他记录元素,就像当您的标题和行数据来自两个或更多类而不是单个类时所做的那样。CsvWriter.NextRecord()
时,CsvWriter会发出定义类型的换行符,并且作者JoshClose表示,您应该在完成标题并完成使用WriteRecord
添加的每个单独行后调用NextRecord()
。请参见GitHub问题列表929
当您使用WriteRecords()
写入多个记录时,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");
}
}
}
NewLine
配置属性进行配置。
E.g.:
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; }
}
header\nrecord1\nrecord2
等。 - C. Augusto Proiete
NextRecord()
来写入 NewLine 字符,那将会很有帮助。 - JoeBrockhaus