如何在Scala中解析此csv文件,以提取对象数据包含(日期,时间,经度,纬度)
* M ......:Dy4.5
* N .........:14_540
* V ... ..:N
* S ...:1.2.1
* YYYY / MM / DD; HH:MM:SS;长; LAT
2016年5月9日; 12:50:19; -122.45006; 38.47320
2016年5月9日; 13:04:10; -122.45011; 38.47317
我已经编写了这个函数,但它只是读取了文件,我不知道如何将其转换为对象
def readData(fileName:String): Vector[Array[String]] = {
for {
line <- Source.fromFile(fileName).getLines().toVector
values = line.split(";").map(_.trim)
} yield values
}
答案 0 :(得分:1)
假设您有类数据
case class Data(date: String, time: String, longitude: String, latitude: String)
(日期和时间只是用于简化示例的字符串)。
下面的代码将为您提供数据对象的向量
def readData(fileName:String): Vector[Data] = {
for {
line <- Source.fromFile(fileName).getLines().toVector
values = line.split(",").map(_.trim)
date = Date(values(0), values(1), values(2), values(3))
} yield date
}
答案 1 :(得分:1)
你可以使用scala类型匹配来建立Anastasiia Kharchenko的回应
def readData(fileName:String): Vector[Data] = {
for {
line <- Source.fromFile(fileName).getLines().toVector
data <- parseCsvLine(line)
} yield data
}
def parseCsvLine(line: String): Option[Data] = {
line.split(";").toVector.map(_.trim) match {
case Vector(date, time, longitude, latitude) => Some(Data(date, time, longitude, latitude))
case _ => println(s"WARNING UNKNOWN DATA FORMAT FOR LINE: $line")
None
}
}
}