如何解决CsvHelper 分隔符与行尾字符相同 文件结构问题解决问题的尝试问题
我在解析一些我知道如何修复的类似 csv 的文件时遇到了一个问题,但我想确认这是否是合适的方法。
文件结构
我试图解析的文件具有与 .csv
类似的结构类似,因为它的值用分隔符分隔(在我的例子中是 |
),但是与我之前看到的不同的是,它在行尾还有一个分隔符,例如:
Column1|Column2|Column3|
Row1Val1|Row1Val2|Row1Val3|
Row2Val1|Row2Val2|Row2Val3|
问题
当我编写一些单元测试来覆盖我的服务时,问题就出现了,这些服务包装在 CsvHelper 库上。当我提供以下配置时,显然存在一些问题:
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = "|",HasHeaderRecord = true,NewLine = "|\r\n"
};
使用上述配置,csvReader.GetRecords()
不会返回任何结果。我相信这是因为解析器的操作顺序是首先查找列,然后是行尾 - 它试图解析空列而没有意识到它实际上是分隔符的一部分。
(我也可以粘贴 getRecords 调用的代码,但它基本上是从示例中提取的通用代码 - 唯一的区别是我使用了 System.IO.Abstractions
库以便于进行单元测试)
解决问题的尝试
如果我删除 NewLine
配置值,解析器在读取文件时工作正常(即使文件末尾有行尾分隔符)。然而,我的“写入 CSV”测试失败了,因为 CsvHelper 不再向文件添加正确的行尾。
问题
有什么方法可以配置 CsvHelper 以使用一种配置覆盖这两种情况,还是应该基本上使用两种不同的配置,具体取决于我是写入 CSV 还是从中读取?这对我来说似乎有点违反直觉,因为它与我试图遵循的格式基本相同,但预期会有不同的配置?
解决方法
您可以手动为每一行写入空列,然后您可以保持读取和写入的配置相同。
void Main()
{
var config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
Delimiter = "|"
};
var records = new List<MyClass>
{
new MyClass {Column1 = "Row1Val1",Column2 = "Row1Val2",Column3 = "Row1Val3"},new MyClass {Column1 = "Row2Val1",Column2 = "Row2Val2",Column3 = "Row2Val3"}
};
using (var writer = new StreamWriter("file.csv"))
using (var csv = new CsvWriter(writer,config))
{
csv.WriteHeader<MyClass>();
csv.WriteField(string.Empty);
foreach (var record in records)
{
csv.NextRecord();
csv.WriteRecord(record);
csv.WriteField(string.Empty);
}
}
using (var reader = new StreamReader("file.csv"))
using (var csv = new CsvReader(reader,config))
{
var importRecords = csv.GetRecords<MyClass>();
importRecords.Dump();
}
}
public class MyClass
{
public string Column1 { get; set; }
public string Column2 { get; set; }
public string Column3 { get; set; }
}
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。