2017-04-26 3 views
1

데이터가 리터럴 인 내 중첩 된 맵 예제입니다. 이 프로그램은 의도 한대로 작동합니다.스칼라 중첩 맵 - 처리 방법은 무엇입니까?

그러나 리터럴을 제거하고 위의 값을 csv 파일에서 읽고 싶습니다. 여기에 csv가 있습니다 :

Early,a,1 
Early,b,2 
Late,x,24 
Late,y,25 

다음은 csv를 읽고 리터럴을 사용하여 위의 프로그램과 유사한 방식으로 값을 인쇄하는 코드입니다.

val bufferedSource = io.Source.fromFile("mapt.csv") 
    val builder = StringBuilder.newBuilder 

    for (line <- bufferedSource.getLines) { 
    val cols = line.split(",").map(_.trim) 
    println(s"${cols(0)}|${cols(1)}|${cols(2)}") 
    var tmp = cols(0) // s"${cols(0)}" 

    val inner = scala.collection.mutable.Map.empty[String, Int] 
    inner(cols(1)) = cols(2).toInt 
    println(inner) 

    val outer = scala.collection.mutable.Map.empty[String, String] 
    outer(cols(0)) = inner 
    println(outer) 

    } 
    bufferedSource.close 

내 코드가 작동하지 않습니다. 중첩 된 맵을 처리하는 방법에 대한 지침을 찾는 데 어려움을 겪고 있습니다. 나는 스칼라를 배우고있다. csv 파일 데이터에서 중첩 된지도를 만드는 제안에 감사드립니다. 대답, 아르 논에 대한

enter image description here

+0

어떤 오류가 발생하고 있습니까? – mfirry

+0

오류 스크린 샷을 추가했습니다. – Fred

답변

3
val lines = scala.io.Source.fromFile("mapt.csv").getLines() 
val row = lines.map(_.split(",").map(_.trim)) 
val outerMap=row.groupBy(_.head) 
val result = outerMap.map{case (key,values)=> 
    key-> values.map(v=>(v(1)->v(2))).toMap} 
+0

니스. mapValues ​​()를 사용하면 마지막 줄이 단순해질 것이라고 생각합니다. – jwvh

0

감사 :

나는 다음과 같은 오류가 발생합니다. 너의 마지막 줄이 나를 어리둥절하게 만들었다. 그러나, 그것은 저에게 문제를 해결하는 것을 도운 새로운 기술을 보여주었습니다. 여기 내 작업 코드입니다 :

val bufferedSource = io.Source.fromFile("mapt.csv") 
    val builder = StringBuilder.newBuilder 

    for (line <- bufferedSource.getLines) { 
    val cols = line.split(",").map(_.trim) 
    println(s"${cols(0)}|${cols(1)}|${cols(2)}") 

    val outerMap = Map(cols(0) -> Map(cols(1) -> cols(2).toInt)) 
    println("outerMap looks like this: " + outerMap) 
    println("Accessing the lowest-level value: " + outerMap(cols(0))(cols(1))) 
    } 
    bufferedSource.close 

내 생각에는 결함이 있습니다. 위의 방법은 awk에서 연관 배열을 중첩시키는 방법의 복사본입니다. 어느 날 스칼라에서 생각하기 시작하겠습니다. 당신은 outer지도가 String 키와 String 값을 갖는 것을 주장하고

:

0

은 특별히 컴파일 오류를 해결합니다.

하지만 나중에 outer(cols(0)) = ???을 할 때 "이 값을 키 cols(0)에 넣고 싶습니다."라고 말하고있는 것입니다.

그래서 컴파일러는지도에 삽입하려는 내용이 예상되는 String과 다른 유형이라고 불평합니다.

주 : 스칼라에서는 변경 가능성을 권장하지 않습니다. 정말로 필요한 경우가 아니면, 변경 불가능한 콜렉션을 사용하여 동일한 종류의 코드를 작성할 수 있습니다.

+1

명확한 설명과 조언을 해주셔서 감사합니다. 나는 내가 얻을 수있는 모든 것을 필요로한다. 보시다시피 아직 크롤링 중이며 아직 걷기 시작하지 않았습니다. 언젠가 나는 훌륭한 Scala 프로그래머가 될 것입니다! – Fred