# The 182 directories of the different persons have to be put into the directory # secondo/bin/Geolife/Data. create database geolife; open database geolife; let mlabeltype = [const rel(tuple([S: string, E: string, L: string])) value ()]; let importMLabelFile = fun(Name: text) mlabeltype csvimport[Name, 1, "", "\t"] projectextend[L; Start: str2instant(replace(replace(.S, "/", "-"), " ", "-")), End: str2instant(replace(replace(.E, "/", "-"), " ", "-"))] projectextend[; U: the_unit(tolabel(trim(.L)), .Start, .End, TRUE, FALSE)] makemvalue[U]; let mpointtype = [const rel(tuple([Y: real, X: real, Zero: int, Alt: int, Days: real, Datestr: string, Timestr: string])) value ()]; let importMPointFile = fun(Name: text) mpointtype csvimport[Name, 6, "", ","] projectextend[; P: makepoint(.X, .Y), Inst: str2instant(.Datestr + "-" + .Timestr)] approximate[Inst, P]; let importMRealFile = fun(Name: text) mpointtype csvimport[Name, 6, "", ","] projectextend[; A: int2real(.Alt), Inst: str2instant(.Datestr + "-" + .Timestr)] approximate[Inst, A]; let getPId = fun(Filename: text, Depth1: int, Depth2: int) substr(Filename, find(Filename, "/") transformstream tail[Depth1] extract[Elem] + 1, find(Filename, "/") transformstream tail[Depth2] extract[Elem] - 1); let getTId = fun(Filename: text) substr(Filename, find(Filename, "/") transformstream tail[1] extract[Elem] + 1, find(Filename, ".") transformstream tail[1] extract[Elem] - 1); let TranspModes = getDirectory('Geolife/Data', 2) transformstream filter[not(isDirectory(.Elem))] filter[.Elem endsWith ".txt"] projectextend[; PId: getPId(.Elem, 2, 1), TMode: importMLabelFile(.Elem)] consume; let Trips = getDirectory('Geolife/Data', 3) transformstream filter[not(isDirectory(.Elem))] filter[.Elem endsWith '.plt'] projectextend[; PId: getPId(.Elem, 3, 2), TId: getTId(.Elem), Trip: importMPointFile(.Elem), Alt: importMRealFile(.Elem)] consume; let geolife = TranspModes feed {tm} Trips feed {t} hashjoin[PId_tm, PId_t] projectextend[; Pid: .PId_tm, Tid: .TId_t, Trip: .Trip_t, Alt: .Alt_t, Trans: .TMode_tm atperiods deftime(.Trip_t)] filter[no_components(.Trans) > 0] consume;