Scala为每个列表项填充一个case类
我有一个国家的csv文件和一个CountryData案例类 文件中的示例数据: 丹麦、欧洲、1.23、7.89 澳大利亚,澳大利亚,8.88,9.99 巴西、南美洲、7.77、3.33 我可以在文件中读取和拆分等来获取 (名单(丹麦、欧洲,1.23、7.89) (名单(澳大利亚、澳大利亚,8.88、9.99) (名单(巴西、南美洲,7.77,3.33) 现在如何为每个列表项填充CountryData案例类? 我试过:Scala为每个列表项填充一个case类,scala,Scala,我有一个国家的csv文件和一个CountryData案例类 文件中的示例数据: 丹麦、欧洲、1.23、7.89 澳大利亚,澳大利亚,8.88,9.99 巴西、南美洲、7.77、3.33 我可以在文件中读取和拆分等来获取 (名单(丹麦、欧洲,1.23、7.89) (名单(澳大利亚、澳大利亚,8.88、9.99) (名单(巴西、南美洲,7.77,3.33) 现在如何为每个列表项填充CountryData案例类? 我试过: for (line <- Source.getLines.drop(1)
for (line <- Source.getLines.drop(1)) {
val splitInput = line.split(",", -1).map(_.trim).toList
val country = splitInput(0)
val region = splitInput(1)
val population = splitInput(2)
val economy = splitInput(3)
val dataList: List[CountryData]=List(CountryData(country,region,population,economy))
for(line不清楚您的问题具体在哪里。是关于Double
vsString
还是关于List
在循环中。类似的方法可能仍然有效
case class CountryData(country: String, region: String, population: Double, economy: Double)
object CountryDataMain extends App {
val src = "\nDenmark, Europe, 1.23, 7.89\nAustralia, Australia, 8.88, 9.99\nBrazil, South America, 7.77,3.33"
val list = Source.fromString(src).getLines.drop(1).map(line => {
val splitInput = line.split(",", -1).map(_.trim).toList
val country = splitInput(0)
val region = splitInput(1)
val population = splitInput(2)
val economy = splitInput(3)
CountryData(country, region, population.toDouble, economy.toDouble)
}).toList
println(list)
}
我会使用scala大小写匹配:即
def doubleOrNone(str: Double): Option[Double] = {
Try {
Some(str.toDouble) //Not sure of exact name of method, should be quick to find
} catch {
case t: Throwable => None
}
}
def parseCountryLine(line: String): Vector[CountryData] = {
lines.split(",").toVector match {
case Vector(countryName, region, population, economy) => CountryData(countryName, region, doubleOrNone(population), doubleOrNone(economy))//I would suggest having them as options because you may not have data for all countries
case s => println(s"Error parsing line:\n$s");
}
}
一般建议:尝试分解问题并隔离问题。例如,splitInput
的值是多少?为什么它是问题的一部分?确保您正确读取和分析了文件,然后通过将splitInput
设置为其所包含的任何值并删除文件读取部分来更新您的问题。My我猜你的CSV的第一行的某个地方有标题/列名,这就是你正在阅读的内容。我可以看到你想删除它,但之前可能有一个空行。无论是哪种方式,案例类填充都应该按照你的预期工作。填充
和经济
需要是双倍
def doubleOrNone(str: Double): Option[Double] = {
Try {
Some(str.toDouble) //Not sure of exact name of method, should be quick to find
} catch {
case t: Throwable => None
}
}
def parseCountryLine(line: String): Vector[CountryData] = {
lines.split(",").toVector match {
case Vector(countryName, region, population, economy) => CountryData(countryName, region, doubleOrNone(population), doubleOrNone(economy))//I would suggest having them as options because you may not have data for all countries
case s => println(s"Error parsing line:\n$s");
}
}