2012-01-16 10 views
1

私はcsvファイルを解析してscalaを使ってWebサービスに投稿する方法を頭に入れて苦労しています。スカラーでファイルを解析してマップを作成しようとすると助けが必要

基本的な考えは、csvファイルからポストパラメータを作成する必要があるということです。そこにはヘッダーがパラメータになり、次の行が値になります。

例のcsv

firstname, lastname, age, weight, height 
John, Doe, 30, 180, 72 
Mary, Jane, 28, 120, 64 

は、これは私がデータを解析するために、次のScalaを持っていますが、次に何をすべきかを把握することができないようなパラメータ firstname=John&lastname=Doe&age=30&weight=180&height=72などに

をマップします

val lines = fromFile("runners/io/m2m/naf/ARDS.csv").getLines 
     for ((line, cnt) <- lines.zipWithIndex) { 
     if (cnt == 0) { 
      for((header, i) <- CsvParser.parse(line).view.zipWithIndex){ 

      } 
     }else { 
      for((data, i) <- CsvParser.parse(line).view.zipWithIndex) { 

      } 
     } 
     } 
+0

ストアi' 'によってインデックス付けマップにヘッダー、および各' data'項目のデータ列へのマッピング私ヘッダCOLのマップを与えマップを検索し、出力ヘッダ=データを出力する。もっと助けが必要ですか? – milan

+0

そうですね、私は不変のマップなどを使うことができますが、この問題に対する機能的なアプローチが必要なようです。 – chiappone

+0

ああ、あなたは「機能的アプローチ」を探しているという質問には指定されていませんでした。 – milan

答えて

6

これはいかがですか?その&で区切らフォーマットを取得するには

scala> for((map, cnt) <- rowMapsIterator.zipWithIndex) println(cnt + ": " + map) 
0: Map(firstname -> John, weight -> 180, lastname -> Doe, age -> 30, height -> 72) 
1: Map(firstname -> Mary, weight -> 120, lastname -> Jane, age -> 28, height -> 64) 

、あなたが代わりに行います:結果がどのように見える

val lines = fromFile("runners/io/m2m/naf/ARDS.csv").getLines 
val header = CsvParser.parse(lines.next) 
val rowMapsIterator = 
    for (line <- lines) 
    yield (header zip CsvParser.parse(line)).toMap 

はその後

val rowStringIterator = rowMapsIterator.map(_.map { case (k, v) => k + "=" + v }.mkString("&")) 

をこれは、あなたが得られます。

scala> for ((s, cnt) <- rowStringIterator.zipWithIndex) println(cnt + ": " + s) 
0: weight=180&firstname=John&height=72&age=30&lastname=Doe 
1: weight=120&firstname=Mary&height=64&age=28&lastname=Jane 
+0

は、ジップのようなものがあることを知らなかった。クールな感謝。 – chiappone

0

私はdhgのnswhere、しかし、CsvParserがList [List]を返すので、リストを平坦化しました。したがって

-

val header = CsvParser.parse(lines.next).flatten 


val rowMapsIterator = 
| for (line <- lines) 
|  yield (header zip CsvParser.parse(line).flatten).toMap 

これは次いで

scala> rowMapsIterator.foreach(println) 
Map(weight -> 180, firstname -> John, height -> 72, age -> 30, lastname -> Doe) 
Map(weight -> 120, firstname -> Mary, height -> 64, age -> 28, lastname -> Jane)