我正在使用Kantan CSV库 - https://nrinaudo.github.io/kantan.csv/- 将CSV解码为案例类的集合。代码片段如下:
case class Journey(origin: String, destination: String)
val file = ??? // read file
val xs: Either[ReadError, List[Journey]] = ReadResult.sequence(file.readCsv[List, Journey](rfc.withHeader))
问题是:我如何强制执行严格的解析,以便如果 CSV 包含任何没有 2 个字段的行,将引发并返回错误(作为 ReadError(
这可能是很长的陈旧,但同样如此:如果我猜对了,你想在遇到 ReadError 时抛出某种异常吗?这违背了函数式编程的目的,在函数式编程中,您不会从任何函数中抛出异常,而是声明函数的返回类型中可能出错的内容 - 因此Either[ReadError, List[Journey]]
。
如果你并不真正关心错误本身,你可以把它"扁平化"成一个选项序列,如下所示:
new File(filePath).readCsv[List, Journey](rfc.withHeader).map {
case Left(_) => None
case Right(value) => Option(value)
}
然而,我不确定这是否是你想要的,你在路上丢失了信息。但是通过这种方式,您将拥有一个发生错误的None
列表以及任何其他情况下的Option[Journey]
,您可以非常轻松地映射它。