【发布时间】:2021-04-06 15:35:56
【问题描述】:
我在解析一些我知道如何修复的类似 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 还是读取它?这对我来说似乎有点违反直觉,因为它与我试图遵循的格式基本相同,但需要不同的配置?
【问题讨论】:
-
我认为
|\r\n不是 EOL 终止符,只是您在 EOL 终止符之前有一个空字段。 -
为什么
NewLine定义为|\r\n而不是\r\n?另外,如果文件不是由 Windows 生成的,它可能不是\r\n,而只是\n。 -
@Neil 我同意 100%。
-
也许问题是您的文件“类似于”CSV 是问题所在。它不是 CSV,处理 CSV 的库也不合适。
-
在 Windows 上,\n 是“\r\n”,在 *nix 上,行终止符只是 \n。如果你真的想让它与系统无关,你可以使用 System.lineSeparator() 。 javatpoint.com/post/java-system-lineseparator-method 如果您在 *nix 系统上并且获得 DOS 行尾,则有一些实用程序可以转换它们,例如 unix2dos 或 dos2unix。使用跨平台文件仍然是一个 PITA,但这些是您应该始终注意的事情。