在scala中解析csv文件

时间:2017-03-30 16:21:38

标签: scala

如何在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
    }

2 个答案:

答案 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
         }

    }
}