gpt4 book ai didi

java - 在 scala 中处理 csv

转载 作者:IT王子 更新时间:2023-10-29 06:30:22 26 4
gpt4 key购买 nike

我正在使用 scala 2.7.7,想解析 CSV 文件并将数据存储在 SQLite 数据库中。

我最终使用 OpenCSV java 库解析 CSV 文件,并使用 sqlitejdbc 库。

使用这些 java 库使我的 scala 代码看起来与 Java 代码几乎相同(没有分号并带有 val/var)

因为我正在处理 java 对象,所以我不能使用 scala list、map 等,除非我进行 scala2java 转换或升级到 scala 2.8

有没有一种方法可以使用我不知道的 scala 位进一步简化我的代码?

val filename = "file.csv";
val reader = new CSVReader(new FileReader(filename))
var aLine = new Array[String](10)
var lastSymbol = ""
while( (aLine = reader.readNext()) != null ) {
if( aLine != null ) {
val symbol = aLine(0)
if( !symbol.equals(lastSymbol)) {
try {
val rs = stat.executeQuery("select name from sqlite_master where name='" + symbol + "';" )
if( !rs.next() ) {
stat.executeUpdate("drop table if exists '" + symbol + "';")
stat.executeUpdate("create table '" + symbol + "' (symbol,data,open,high,low,close,vol);")
}
}
catch {
case sqle : java.sql.SQLException =>
println(sqle)

}
lastSymbol = symbol
}
val prep = conn.prepareStatement("insert into '" + symbol + "' values (?,?,?,?,?,?,?);")
prep.setString(1, aLine(0)) //symbol
prep.setString(2, aLine(1)) //date
prep.setString(3, aLine(2)) //open
prep.setString(4, aLine(3)) //high
prep.setString(5, aLine(4)) //low
prep.setString(6, aLine(5)) //close
prep.setString(7, aLine(6)) //vol
prep.addBatch()
prep.executeBatch()
}
}
conn.close()

最佳答案

如果你有一个简单的 CSV 文件,另一种方法是根本不使用任何 CSV 库,而只是简单地在 Scala 中解析它,例如:


case class Stock(line: String) {
val data = line.split(",")
val date = data(0)
val open = data(1).toDouble
val high = data(2).toDouble
val low = data(3).toDouble
val close = data(4).toDouble
val volume = data(5).toDouble
val adjClose = data(6).toDouble

def price: Double = low
}

scala> import scala.io._

scala> Source.fromFile("stock.csv") getLines() map (l => Stock(l))
res0: Iterator[Stock] = non-empty iterator


scala> res0.toSeq
res1: Seq[Stock] = List(Stock(2010-03-15,37.90,38.04,37.42,37.64,941500,37.64), Stock(2010-03-12,38.00,38.08,37.66,37.89,834800,37.89) //etc...

这样做的好处是您可以使用完整的 Scala 集合 API。

如果您更喜欢使用解析器组合器,还有一个 csv parser combinator 的示例在 github 上。

关于java - 在 scala 中处理 csv,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3031064/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com