首页 > 解决方案 > 案例类超过 22 个字段到 Scala 中的 CSV

问题描述

是否有任何库可以将具有超过 22 个字段的案例类转换为 CSV?我尝试使用kantan,但编码器只允许 22 个字段。

PS:我使用带有简单解码功能的 circe 将 json 字符串序列化为 27 个字段案例类。多亏了这个

标签: scalacsvcase-class

解决方案


可能有几种解决方案。显然,如果你可以将一个 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)))

资源


推荐阅读