使用CsvHelper时如何指定正确的行终止符?
CsvHelper生成CSV行终止符失效、内容挤成一行的解决办法
你的问题核心是:调用WriteHeader和WriteRecord后没有主动触发换行操作,导致所有内容拼接在同一行里——NewLine配置本身是生效的,只是你没让CsvHelper执行换行动作。
解决方法
有两种修改方式:
方式1:手动添加换行操作
在写完表头和每条记录后,调用csv.NextRecord();,它会自动使用你配置的\r\n作为行终止符:
static void Main(string[] args) { string filename1 = @"d:\temp\testfile1.csv"; var records = new List<Foo> { new Foo { Id = 1, Name = "one" }, new Foo { Id = 2, Name = "two" }, new Foo { Id = 3, Name = " \nthree\n " }, new Foo { Id = 4, Name = "four" } }; var config = new CsvConfiguration(CultureInfo.InvariantCulture) { WhiteSpaceChars = [' ', '\t'], NewLine = "\r\n" }; int rowcount = 0; using (var writer = new StreamWriter(filename1,false)) using (var csv = new CsvWriter(writer, config)) { csv.WriteHeader<Foo>(); csv.NextRecord(); // 写完表头后换行 foreach (var item in records) { item.row = ++rowcount; csv.WriteRecord<Foo>(item); csv.NextRecord(); // 写完每条记录后换行 } } }
方式2:使用WriteRecords简化代码
WriteRecords方法会自动处理每条记录的换行逻辑,无需手动调用NextRecord:
static void Main(string[] args) { string filename1 = @"d:\temp\testfile1.csv"; var records = new List<Foo> { new Foo { Id = 1, Name = "one" }, new Foo { Id = 2, Name = "two" }, new Foo { Id = 3, Name = " \nthree\n " }, new Foo { Id = 4, Name = "four" } }; // 先给记录赋值row字段 int rowcount = 0; foreach (var item in records) { item.row = ++rowcount; } var config = new CsvConfiguration(CultureInfo.InvariantCulture) { WhiteSpaceChars = [' ', '\t'], NewLine = "\r\n" }; using (var writer = new StreamWriter(filename1,false)) using (var csv = new CsvWriter(writer, config)) { csv.WriteHeader<Foo>(); csv.NextRecord(); // 表头后换行 csv.WriteRecords(records); // 自动写入所有记录并换行 } }
效果验证
修改后生成的CSV会完全符合你的预期格式:
Id,Name,row 1,one,1 2,two,2 3," three ",3 4,four,4
内容的提问来源于stack exchange,提问作者Luuk
相关产品推荐
相关产品推荐

