Scala为每个列表项填充一个case类

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)

我有一个国家的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)) {  
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
vs
String
还是关于
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"); 
   }
}