|
Ein erster Ansatz
object symbols extends Enumeration{
val Unbekannt = Value("Unbekannt")
val Datum = Value("Datum")
val Uhrzeit = Value("Uhrzeit")
val Ereignis = Value("Ereignis")
val Tag = Value("Tag")
val Gruppe = Value("Gruppe")
val ID = Value("ID")
}
object Utils{
def transform( symStr: Seq[String]): Seq[symbols.Value] = {
var result = Seq[symbols.Value]()
for (it <- symStr){
val opt = symbols.valueOf(it)
opt match{
case Some(_) => result = result ++ Seq(opt.get)
case None => result = result ++ Seq(symbols.Unbekannt)
}
}
return result
}
def csv_split( line: String ): Array[String] = {
var l = line.substring(1,line.length-2)
l.split("","")
}
}
class Record(s: Seq[symbols.Value] ) extends HashMap[Int,Any]{
for (e <- s) put(e.id, null) // anlegen der Schlüssel ohne Daten
def apply (s: symbols.Value) = get(s.id).get // get erzeugt ein Some und Some.get ergibt das Objekt
def update(s: symbols.Value, v: Any) = super.update(s.id,v)
def pi(seq: Seq[symbols.Value]): Record = {
var result = new Record(seq)
for (e <- seq) result(e) = apply(e)
return result
}
}
class Table(name: String, sym: Seq[symbols.Value]){
var rows = Seq[Record]()
def getName() = name // brauchts, weil name privat deklariert ist
def this( name: String, symStr: Array[String] ) = this( name, Utils.transform(symStr) ) // wird bei Laden aus der Datei benötigt
def append (lines: Seq[Record]) = rows = rows ++ lines
def insert(s: Seq[Any]) = {
val r = new Record(sym); var i = 0
for (elem<-sym){ r(elem) = s(i); i += 1 }
rows = rows ++ Seq(r)
}
def count = rows.length
def filter(f: Record=>Boolean): Table = {
var result = new Table(name+'*', sym)
result.append( rows.filter(f) )
return result
}
def pi(seq: Seq[symbols.Value]): Table = {
var result = new Table(name+'*', seq)
for (it <- rows) result.rows = result.rows ++ Seq(it.pi(seq))
return result
}
def pi(sa: Array[String]): Table = {
var nsym = Utils.transform(sa)
return pi(nsym)
}
override def toString(): String = {
var result = ""
for (r<-rows) result += r.toString + "\\n"
return result
}
}
|