2016-11-17 1 views
0

Scalaのコードがいくつかありますが、私が望む方法でオブジェクトを生成する方法を見つけようとしています。戻る。私はScalaには新しく、このユースケースには何が正しいのかよく分からず、出力されたデータからどのようにフォーマットするのかよく分かりません。CSVのArrayBuffer出力をScalaの最適なオブジェクトの1行に返すように変換する

この関数をgetId('1.5')のように呼び出し、CSVのデータから構築したオブジェクトを取得したいと考えています。 CSVのデータは次のようになります。

,,ID,H2,H3,H4,H5,H6,H7,H8,H9,H10,H11,, 
0.5,0.295,17.70%,2.70%,0.00%,0.02%,6.17%,0.01%,0.00%,0.00%,32.34%,41.05%,0.00%,, 
1,0.34,18.64%,3.83%,0.00%,0.23%,7.67%,0.52%,0.00%,0.00%,30.57%,38.53%,0.00%,, 

だから私は戻って戻りデータとしてキーを持つ行を取得することができるようにしたいテーブルに

ID H2  H3 
0.5 0.295 17% 

を出力します。だから、(一例として、JSONを使用して)getId('0.5')を要求した後、擬似オブジェクト内:

{ 
    "H2": "0.295", 
    "H3": "17%" 
} 

私はval x = getId('1.5')を言うことができるので、簡単に私のコードベース内の他の場所でそれを使用することができるようにしたいです。その後、x.H3が17%になる。これは主にループで使用されます。ここに私がこれまで持っているものがあります。

def getId(id: String) = { 
    val filePath = getClass.getClassLoader.getResource("my_data.csv").getPath 

    // each row is an array of strings (the columns in the csv file) 
    val rows = ArrayBuffer[Array[String]]() 

    // (1) read the csv data 
    using(io.Source.fromFile(filePath)) { source => 
    for (line <- source.getLines) { 
     rows += line.split(",").map(_.trim) 
    } 
    } 

    // (2) print the results, here I'd actually be constructing that return object... 
    for (row <- rows) { 
    println(s"${row(0)} | ${row(2)} | ${row(3)} | ${row(4)}") 
    } 

    def using[A <: { def close(): Unit }, B](resource: A)(f: A => B): B = 
    try { 
     f(resource) 
    } finally { 
     resource.close() 
    } 
} 

答えて

0

これはお客様のニーズを満たしていますか?コードを少し微調整しました。データをMap[String, String]として取得し、より安全な構造にすることもできます。ケースクラス。

import scala.collection.mutable 
import scala.io.Source 

object FromCSV { 
    def main(args: Array[String]) { 
    val records = readDataFromFile 
    val myRecord = records("0.5") 
    } 

    def readDataFromFile: Map[String, Record] = { 
    val filePath = getClass.getClassLoader.getResource("my_data.csv").getPath 
    val fieldSeparator = "," 
    val records = mutable.Map.empty[String, Record] 

    // each row is an array of strings (the columns in the csv file) 
    val rows = mutable.ArrayBuffer.empty[Map[String, String]] 

    // (1) read the csv data 
    using(Source.fromFile(filePath)) { source => 
     var lineNum = 0 
     var colNames = Seq.empty[String] 
     for (line <- source.getLines) { 
     lineNum += 1 
     lineNum match { 
      case 1 => colNames = line.split(fieldSeparator) 
      case _ => rows += (colNames zip line.split(fieldSeparator).map(_.trim)).toMap 
     } 
     } 
    } 

    // (2) print the results, here I'd actually be constructing that return object... 
    for (row <- rows) { 
     println(s"${row("ID")} | ${row("H2")} | ${row("H3")} | ${row("H4")}") 
     val r = Record(row("ID"), row("H2"), row("H3")) 
     records(r.id) = r 
    } 

    def using[A <: { def close(): Unit }, B](resource: A)(f: A => B): B = 
     try { 
     f(resource) 
     } finally { 
     resource.close() 
     } 
    records.toMap 
    } 
} 

case class Record(id: String, h2: String, h3: String) 
関連する問題