在 Scala 中创建 csv 文件

Creating csv file in Scala

我正在尝试通过从第三方 API 获取 JsValue 形式的数据,在 Scala 中创建一个 csv 文件。 我将数据保存到 CSV 文件的方法是:

def saveToCSV(str:Seq[JsValue]) = {
  val outputFile = new BufferedWriter(new FileWriter("Result.csv"))
  val csvWriter = new CSVWriter(outputFile)
    val data = str.head
    data match {
      case JsObject(fields) => {
        var listOfRecords = new ListBuffer[Array[String]]()
        //val csvFields = Array("Open","High","Low","Close","Volume")
        //listOfRecords += csvFields
        fields.values.foreach(value => {
          val jsObject = value.asJsObject()
          val nameList = List(jsObject.fields("1. open").toString,jsObject.fields("2. high").toString,jsObject.fields("3. low").toString,jsObject.fields("4. close").toString,jsObject.fields("5. volume").toString)
          listOfRecords += Array(nameList.toString)
          csvWriter.writeAll(listOfRecords.toList.asInstanceOf)
          println("Written!")
          outputFile.close()
        })
      }
      case JsNull => println("Null")
    }

在上述 **csvWriter.writeAll(listOfRecords.toList.asInstanceOf)** 行的代码中,我遇到了这个异常。

Exception in thread "main" java.lang.ClassCastException: class scala.collection.immutable.$colon$colon cannot be cast to class scala.runtime.Nothing$ (scala.collection.immutable.$colon$colon and scala.runtime.Nothing$ are in unnamed module of loader 'app')

csvWriter.writeAll(listOfRecords.toList.asInstanceOf) 这一行中删除 asInstanceOf 时,我在 writeAll() 方法上得到一个编译时错误,说它需要 util.List[Array[String]]

类型的参数

谁能帮我解决这个问题?

你的代码有几个错误。

  1. asJsObject()JsValue中不存在的方法。相反,您应该使用 value.as[JsObject].
  2. jsObject.fieldsSeq[(String, JsValue)]类型,所以不能调用jsObject.fields("1. open")。相反,您应该调用:jsObject("1. open").toString
  3. 呼叫 listOfRecords.toList.asInstanceOf returns null。您应该指定要将其转换为什么。但是为了将它转换成java类型,你可以调用:listOfRecords.toList.asJava。别忘了:import scala.jdk.CollectionConverters._

完整的方法是:

import com.opencsv.CSVWriter
import play.api.libs.json.{JsNull, JsObject, JsValue}

import java.io.{BufferedWriter, FileWriter}
import scala.collection.mutable.ListBuffer
import scala.jdk.CollectionConverters._

def saveToCSV(str: Seq[JsValue]) = {
  val outputFile = new BufferedWriter(new FileWriter("Result.csv"))
  val csvWriter = new CSVWriter(outputFile)
  val data = str.head
  data match {
    case JsObject(fields) => {
      var listOfRecords = new ListBuffer[Array[String]]()
      //val csvFields = Array("Open","High","Low","Close","Volume")
      //listOfRecords += csvFields
      fields.values.foreach(value => {
        val jsObject = value.as[JsObject]
        val nameList = List(jsObject("1. open").toString, jsObject("2. high").toString, jsObject("3. low").toString, jsObject("4. close").toString, jsObject("5. volume").toString)
        listOfRecords += Array(nameList.toString)
        csvWriter.writeAll(listOfRecords.toList.asJava)
        println("Written!")
        outputFile.close()
      })
    }
    case JsNull => println("Null")
  }
}

假设 str 的头部包含一个 JsObject,其字段为:

  • “1.打开​​”
  • “2.高”
  • “3.低”
  • "4.关闭"

你是故意只取这个函数输入的第一个元素吗?请注意 str.head 是不安全的,以防序列为空。