jvm/src/net/tz/spss/SpssReader.scala
author Tomas Zeman <tomas@functionals.cz>
Tue, 21 Jul 2020 17:16:53 +0200
changeset 9 0bcde61ea869
parent 5 44aad285dc66
permissions -rw-r--r--
SpssReader: handle StringValues properly.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
2
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     1
package net.tz.spss
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     2
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     3
import java.io.File
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     4
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     5
import com.bedatadriven.spss.SpssDataFileReader
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     6
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     7
import scala.collection.JavaConverters._
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     8
import scala.language.postfixOps
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
     9
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    10
class SpssReader(private val r: SpssDataFileReader)
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    11
  extends Iterator[Map[SpssVariable, SpssValue]] {
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    12
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    13
  lazy val variables: List[SpssVariable] =
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    14
    r.getVariables.asScala.toList map spssVarJtoS
2
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    15
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    16
  override def hasNext: Boolean = r.readNextCase()
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    17
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    18
  override def next(): Map[SpssVariable, SpssValue] =
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    19
    variables map(v => (v, asValue(v))) toMap
2
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    20
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    21
  private def asValue(variable: SpssVariable): SpssValue = {
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    22
    val i = variable.index
9
0bcde61ea869 SpssReader: handle StringValues properly.
Tomas Zeman <tomas@functionals.cz>
parents: 5
diff changeset
    23
    if (r.isSystemMissing(i)) {
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    24
      SystemMissing
9
0bcde61ea869 SpssReader: handle StringValues properly.
Tomas Zeman <tomas@functionals.cz>
parents: 5
diff changeset
    25
    } else if (variable.isNumeric) {
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    26
      Option(r.getDoubleValue(i)) map(x =>
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    27
        if (r.isValueMissing(i, x)) MissingDouble(x) else DoubleValue(x)
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    28
        ) getOrElse SystemMissing
9
0bcde61ea869 SpssReader: handle StringValues properly.
Tomas Zeman <tomas@functionals.cz>
parents: 5
diff changeset
    29
    } else {
0bcde61ea869 SpssReader: handle StringValues properly.
Tomas Zeman <tomas@functionals.cz>
parents: 5
diff changeset
    30
      Option(r.getStringValue(i)) map StringValue getOrElse SystemMissing
0bcde61ea869 SpssReader: handle StringValues properly.
Tomas Zeman <tomas@functionals.cz>
parents: 5
diff changeset
    31
    }
5
44aad285dc66 Fixed js build.
Tomas Zeman <tomas@functionals.cz>
parents: 2
diff changeset
    32
  }
2
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    33
}
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    34
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    35
object SpssReader {
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    36
  def apply(f: File): SpssReader = new SpssReader(new SpssDataFileReader(f))
7461111ce9ed Spss variable, value and reader wrapper.
Tomas Zeman <tzeman@volny.cz>
parents:
diff changeset
    37
}