# HG changeset patch # User Tomas Zeman # Date 1552572373 -3600 # Node ID 7461111ce9ed3c417e8ec65a96bc0f0fb7c74a19 # Parent 3a70d40db0fdc3e605375353e4c0b64cc7a5588b Spss variable, value and reader wrapper. diff -r 3a70d40db0fd -r 7461111ce9ed jvm/src/net/tz/spss/SpssReader.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jvm/src/net/tz/spss/SpssReader.scala Thu Mar 14 15:06:13 2019 +0100 @@ -0,0 +1,25 @@ +package net.tz.spss + +import java.io.File + +import com.bedatadriven.spss.SpssDataFileReader + +import scala.collection.JavaConverters._ +import scala.language.postfixOps + +class SpssReader(private val r: SpssDataFileReader) + extends Iterator[Map[SpssVariable, SpssValue]] { + + lazy val variables: List[SpssVariable] = + r.getVariables.asScala.toList map(SpssVariable(_)) + + override def hasNext: Boolean = r.readNextCase() + + override def next(): Map[SpssVariable, SpssValue] = + variables map(v => (v, SpssValue(r, v))) toMap + +} + +object SpssReader { + def apply(f: File): SpssReader = new SpssReader(new SpssDataFileReader(f)) +} \ No newline at end of file diff -r 3a70d40db0fd -r 7461111ce9ed shared/net/tz/spss/SpssValue.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shared/net/tz/spss/SpssValue.scala Thu Mar 14 15:06:13 2019 +0100 @@ -0,0 +1,33 @@ +package net.tz.spss + +import com.bedatadriven.spss.SpssDataFileReader + +sealed trait SpssValue + +sealed trait Missing extends SpssValue + +abstract class Value[T] extends SpssValue { + def v: T +} + +abstract class MissingValue[T] extends Value[T] + +case class StringValue(v: String) extends Value[String] +case class DoubleValue(v: Double) extends Value[Double] +case object SystemMissing extends Missing +// ??? case class MissingString(v: String) extends MissingValue[String] +case class MissingDouble(v: Double) extends MissingValue[Double] + +object SpssValue { + + def apply(r: SpssDataFileReader, variable: SpssVariable): SpssValue = { + val i = variable.index + if (r.isSystemMissing(i)) + SystemMissing + else + Option(r.getDoubleValue(i)) map(x => + if (r.isValueMissing(i, x)) MissingDouble(x) else DoubleValue(x) + ) orElse (Option(r.getStringValue(i)) map StringValue + ) getOrElse SystemMissing + } +} diff -r 3a70d40db0fd -r 7461111ce9ed shared/net/tz/spss/SpssVariable.scala --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/shared/net/tz/spss/SpssVariable.scala Thu Mar 14 15:06:13 2019 +0100 @@ -0,0 +1,32 @@ +package net.tz.spss + +import net.tz.spss.SpssVariable.DoubleRange +import com.bedatadriven.spss.{SpssVariable => JVar} + +import scala.collection.JavaConverters._ +import scala.language.postfixOps + +case class SpssVariable(name: String, shortName: String, isNumeric: Boolean, + index: Int, label: String, + missingRange: Option[DoubleRange] = None, + missing: List[Double] = Nil, + missingStrings: List[String] = Nil, + labels: Map[Double, String] = Map()) + +object SpssVariable { + type DoubleRange = (Double, Double) + + def apply(v: JVar): SpssVariable = SpssVariable( + name = v.getVariableName, + shortName = v.getShortName, + isNumeric = v.isNumeric, + index = v.getIndex, + label = v.getVariableLabel, + missingRange = if (v.isHasMissingRange) + Some((v.getMissingMin.doubleValue(), v.getMissingMax.doubleValue())) + else None, + missing = v.getMissing.asScala.map(_.doubleValue()).toList, + missingStrings = v.getMissingStrings.asScala.toList, + labels = v.getValueLabels.asScala.map { case (k,x) => + (k.doubleValue(), x) } toMap) +}