拆分字符串并添加输出字符串并在scala中创建一个hashmap

时间:2016-10-28 16:45:36

标签: scala parsing split hashmap

我有一个包含两列的csv文件,如下所示:

column1                             column2
sachin@@@tendulkar@@@Ganguly       cricket@@@India@@@players

我想将其转换为哈希映射,如下所示:

sachin-> "cricket, India, players"
tendulkar-> "cricket, India, players"
Ganguly-> "cricket, India, players"

板球,印度,球员这应该是一个字符串。我怎样才能在scala中完成它? 这就是我到目前为止所做的事情

val csv = sc.textFile("/tag/players.csv")  
val headerAndRows = csv.map(line => line.split(",").map(_.trim))
val header = headerAndRows.first()  
val synonyms = csv.map(_.split(",")).map( p=>(p(1))  // for column1
val targettag = csv.map(_.split(",")).map(p=>p(2))   // for column2
val splitsyno = synonyms.map(x => x.split("@@@"))
val splittarget = targettag.map(x=>x.split("@@@"))

我想知道如何继续创建所需的hashmap?

3 个答案:

答案 0 :(得分:1)

该代码适用于单行。之后,您可以根据需要合并所有行。我已经对提供的行进行了硬编码。

首先,它将数据拆分为元组。 Step2正在取代' @@@' of column2 with','。 第3步是拆分第1列' at' @@@'并将其映射到元组作为Map的元素,然后将其转换为地图。

您可以完全优化解决方案。

val data = "sachin@@@tendulkar@@@Ganguly, cricket@@@India@@@players"

val (c1:String, c2:String) = data.split(",") match {
  case Array(a, b) => (a,b)
}
val c2s = c2.replace("@@@", ",")
val xx = c1.split("@@@").map(_ -> c2s).toMap

// Just to validate the ouput
xx.foreach(f => println(f._1 + "->" + f._2))

答案 1 :(得分:1)

我会执行以下操作(请注意,我跳过映射一行csv以提取s[b] = 1 column1):

column2

答案 2 :(得分:0)

此代码有效,但非常“功能”

import scala.collection.mutable.Map

object parseData {
  val inputSource = io.Source.fromFile("<input-file>")
  val dataMap = Map.empty[String, String]
  for (line <- inputSource.getLines.drop(1)) {
    val keysAndValues = line.split(" +")
    val keys = keysAndValues(0).split("@@@")
    val values = keysAndValues(1).split("@@@").mkString(", ")
    for (k <- keys) {
      dataMap += (k -> values)
    }
  }
  inputSource.close
}

我们可能会把一堆事情说成一堆。但这是一个很好的开始。 drop(1)不会在column1中包含column2dataMap

输出:

Map(tendulkar -> cricket, India, players, Ganguly -> cricket, India, players, sachin -> cricket, India, players)