case class более 22 полей в CSV в Scala - PullRequest
0 голосов
/ 11 апреля 2020

Есть ли библиотека, которая преобразует класс дел с более чем 22 полями в CSV? Я попытался использовать kantan , но кодировщик допускает только 22 поля.

PS: я сериализовал строку json для класса 27 полей, используя circe с простой функцией декодирования. Благодаря это .

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Каким-то образом удалось найти решение для записи всех полей в файл.

  1. Я разделил класс дел из 27 полей на два класса дел.
  2. Затем я написал CellEncode неявно для этих двух классов дел
  3. Тогда RowEncoder неявно для класса дел, который содержит 2 вновь созданных класса дел в качестве полей
  4. В Final Excel будет 2 столбца с разделенными информационными каналами всех 27 столбцов. Затем вы можете преобразовать разделенный по конвейеру контент в столбцы в Excel.
case class subCaseClass1 ( id: Int, name: String) //customer info
case class subCaseClass2 (paymentId: Int, itemId: Int) //payment info
case class finalCaseClass (header: subCaseClass1, payment: subCaseClass2)

//Cell encode Implicits
implicit val CustomerInfoCellEncode: CellEncoder[subCaseClass1] = CellEncoder.from(x => s"${x.asInstanceOf[subCaseClass1].id}|${x.asInstanceOf[subCaseClass1].name}")
implicit val PaymentInfoCellEncode: CellEncoder[subCaseClass2] = CellEncoder.from(x => s"${x.asInstanceOf[subCaseClass2].paymentId}|${x.asInstanceOf[subCaseClass2].itemId}")

// RowEncoder implicit
implicit val paymentTupleRowEncoder: RowEncoder[finalCaseClass]= RowEncoder.encoder(0, 1)((is: finalCaseClass) => (is.subCaseClass1, is.subCaseClass2))

//Write to CSV
new File("test.csv").writeCsv(value,rfc) //value is List(finalCaseClass)
0 голосов
/ 12 апреля 2020

Для этого может быть несколько решений. Очевидно, что если вы можете преобразовать класс * 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)))

Источник

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...