scala - 案例类超过 22 个字段到 Scala 中的 CSV
问题描述
是否有任何库可以将具有超过 22 个字段的案例类转换为 CSV?我尝试使用kantan,但编码器只允许 22 个字段。
PS:我使用带有简单解码功能的 circe 将 json 字符串序列化为 27 个字段案例类。多亏了这个。
解决方案
可能有几种解决方案。显然,如果你可以将一个 json 转换为 27 个字段的案例类,那么你可以先将 csv 转换为 json,然后再对 json 进行解码。您可以找到转换器库:
1.这里
2.这里
其次,github repo 上已经有关闭的问题。他们建议将大案例类拆分为较小的案例类。
import kantan.csv._
final case class RootModel(model1: Model1, model2: Model2)
final case class Model1(value: Int)
final case class Model2(value: String)
object RootModel {
implicit val headerDecoder: HeaderDecoder[RootModel] = {
// Decoders for Model1 and Model2
implicit val model1Decoder: HeaderDecoder[Model1] = HeaderDecoder.decoder("Header1")(Model1)
implicit val model2Decoder: HeaderDecoder[Model2] = HeaderDecoder.decoder("Header2")(Model2)
new HeaderDecoder[RootModel] {
override def fromHeader(header: Seq[String]) =
// Turns the header into row decoders for Model1 and Model2
for {
model1D ← model1Decoder.fromHeader(header)
model2D ← model2Decoder.fromHeader(header)
} yield
// Merge these two decoders into a single RowDecoder
RowDecoder.from { row ⇒
for {
model1 ← model1D.decode(row)
model2 ← model2D.decode(row)
} yield RootModel(model1, model2)
}
// There's unfortunately nothing we can do if no header is provided.
override def noHeader = sys.error("Attempting to decode without a header.")
}
}
}
如何使用它:
scala> import kantan.csv._
scala> import kantan.csv.ops._
scala> "Header1,Header2\n1,foo".asCsvReader[RootModel](rfc.withHeader).foreach(println _)
// Success(RootModel(Model1(1),Model2(foo)))
推荐阅读
- python - 如果您创建自己的操作系统,是否需要制作自己的编译器/解释器来编写普通程序?
- python - 像素化位置和通量的算法
- ios - 在 SwiftUI 中使用 For 循环获取 Firebase 数据
- reactjs - 无法使用带有 react-router-dom 的 Route children vs Route 组件
- sql - 如何获取前6个月的数据,从oracle sql中的当前月份开始按月分组?
- tcp - 如何在 Rust 中建立与 kafka 服务器的连接
- c# - 如何使用 MOQ 对静态方法进行单元测试?
- c# - AspNet MVC 通过用户名获取任何用户(不是当前用户)的用户或身份对象
- google-apps-script - Apps 脚本自定义公式优化
- automation - 如何自动创建 JMeter 脚本?