在 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]]
类型的参数
谁能帮我解决这个问题?
你的代码有几个错误。
asJsObject()
是JsValue
中不存在的方法。相反,您应该使用 value.as[JsObject]
.
jsObject.fields
是Seq[(String, JsValue)]
类型,所以不能调用jsObject.fields("1. open")
。相反,您应该调用:jsObject("1. open").toString
- 呼叫
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
是不安全的,以防序列为空。
我正在尝试通过从第三方 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]]
谁能帮我解决这个问题?
你的代码有几个错误。
asJsObject()
是JsValue
中不存在的方法。相反,您应该使用value.as[JsObject]
.jsObject.fields
是Seq[(String, JsValue)]
类型,所以不能调用jsObject.fields("1. open")
。相反,您应该调用:jsObject("1. open").toString
- 呼叫
listOfRecords.toList.asInstanceOf
returnsnull
。您应该指定要将其转换为什么。但是为了将它转换成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
是不安全的,以防序列为空。