Для этого может быть несколько решений. Очевидно, что если вы можете преобразовать класс * json в 27 полей, то вы можете сначала преобразовать csv в json, а затем декодировать json. Вы можете найти конвертер библиотеки: 1. здесь 2. здесь
Во-вторых, на github-репо уже закрыт вопрос. Они предлагают разбить большой класс case на классы меньшего case.
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)))
Источник