210 likes | 332 Views
Uebung 01. Dateien. Rohdaten. Einzeldaten Gemessene Daten liegen normalerweise als reelle Zahlen vor, d.h. computertechnisch meist als float bzw. long .
E N D
Uebung 01 Dateien
Rohdaten • EinzeldatenGemessene Daten liegen normalerweise als reelle Zahlen vor, d.h. computertechnisch meist als float bzw. long. • DatensatzEin Datensatz ist daher eine Folge (Zeile) fester Länge n von Zahlen und die Prozessdaten bilden wieder eine Folge von Datensätzen • DateiEine Rohdaten-Datei besteht damit aus einer Anzahl von Zeilen, die jeweils n Zahlen enthalten, die durch einen Trenner (Lehrzeichen, Komma o.ä.) voneinander getrennt sind. • ZusatzinformationenManchmal wird noch eine Zeile aus Namen für die n Parameter der Datensätze und manchmal noch Informationen über Bedeutung und Entstehung der Daten vorangestellt. H. Werner : Datenalyse
Raw-Dateien • Im Folgenden erwarten wir von den Rohdatenliferanten Dateien im Textformatfolgender Struktur: • Datenzeilen:durch einen Trenner \s , ;, \t,..) getrennte numerische Werte (Textstücke die als Zahlen interpretiert werden können), jede solche Zeile stellt einen Datensatz dar und alle Datensätze sollten gleich viele Parameter (Werte) enthalten. • Kommentare:Textzeilen, die nicht mit einem numerischen Wert beginnen und Zeilenenden nach einem Kommentarzeichen #. Um Missinterpretationen zu vermeiden, ist es sinnvoll, auch alle Kommentarzeilen mit # beginnen zu lassen • Kommentarzeilen können z.B. Informationen über den Prozess enthalten, aus dem die Daten stammen. • Meist enthalten Rohdaten-Dateien eine Zeile mit getrennten Namen, die als Bezeichner für die einzelnen Parameter in den Datensätzen dienen. • Oft werden auch numerische Informationen wie Wertebereiche, Anzahl von Daten/Datensatz und Datensätzen, Min, Max, Mittel,… in Kommentarzeilen angegeben. H. Werner : Datenalyse
Tag-Dateien • Numerische Wertewerden als Zeichenfolgen notiert, beim Einlesen müssen diese Zeichenfolgen wieder in numerische Werte umgewandelt (geparsed) werden. • tag-DateienEin bewährtes Format sind die tag-Dateien (eine Vorstufe von XML), in denen die Daten in Elementen zusammengefasst werden. • Elementebeginnen und enden mit jeweils einem Namensfeld (tag) der Form <Name> und </Name>, zwischen denen Daten und/oder weitere Elemente stehen. Die Namen sollen dem Leser hinweise zur Bedeutung der eingeschlossenen Daten und Elemente geben. • XMLBei XML kommt noch eine Grammatik hinzu, welche Elemente möglich sind und wie sie ineinander stehen können/sollen. • Diese Darstellungsart eignet sich besonders für Darstellungen in Html-Seiten und bei der Verwendung in Datenbanken. Für die Arbeit am Rechner sind die meist zu schwerfällig. H. Werner : Datenalyse
Datei-header • Als sehr nützlich haben sich Kommentarzeilen erwiesen, in dem allgemeine Informationen gesammelt werden. • headerIm Dateikopf können verschiedene wichtige Informationen gespeichert werden, welcher Art und Herkunft die enthaltenen Daten sind, z.B. # project_name = … # recording_date = … # author = … # separator = “…“ (Das hier verwendete Trenner-Symbol) # sample_number = k (Anzahl der Daten-Zeilen) # chanel_number = n (Anzahl der Parameter i.e. Daten/Zeile) # chanel_names = … (Folge der Parameter-Namen ; n Items) etc. H. Werner : Datenalyse
statistics • Oft kann es wichtig sein, über die numerischen Daten in einer Datei numerische Übersichtsinformationen (über die Anzahl von Parametern und Datensätzen hinaus) zu haben. • In diesem Bereich können verschiedene numerische Informationen zu den einzelnen Parametern gespeichert werden, z. B. # sum_of_values = …,… # sum_of_squares = …,… # maximum_values = …,… # minimum_values = …,… # mean_values = …,… # range_high = …,… # range_low = …,… etc. • Eine solche Statistik-Sektion kann wiederholte Berechnungen immer wieder derselben Zahlwerte ersparen helfen. H. Werner : Datenalyse
data • Der wichtigste Abschnitt ist der Daten -Abschnitt, in dem sich die Datenzeilen (Datensätze, records) befinden. • Dieser Abschnitt besteht genau aus den Datenzeilen ohne alle Kommentarzeilen einer Rohdaten-Datei, d.h. er hat so viele Zeilen, wie es Datensätze gibt und jede Zeile enthält die Werte aus einem Datensatz (durch einen Trenner z.B. \t getrennt). • Zwischen den Datenzeilen können weitere Kommentarzeilen als Erläuterung stehen. H. Werner : Datenalyse
Aufgabe 1: • Entwickle get , set und append Hilfsprogramme, mit denen bestimmte Kommentar- oder Datenzeilen aus einer raw-datei geholt werden können • get(string) file nimmt ein Textstück string (z.B. ‘# author=‘) entgegen, sucht in der Datei file eine Zeile, die mit string anfängt und gibt den Rest der Zeile nach dem string aus. Wenn eine solche Zeile nicht existiert, wird der leere String ““ ausgegeben • set(string,zeile) filenimmt Textstück string (z.B. ‘# author=‘) und zeile entgegen, sucht in der Datei file eine Zeile, die mit string anfängt, löscht diese Zeile , falls sie existiert, und schreibt stattdessen die Konkatenationstring zeile in diese Datei. • append(string,zeile) filetut dasselbe, wie set, nur daß die gefundene Zeile nicht gelöscht wird, sondern append hängt zeile an die gefundene Zeile an (z.B. einen weiteren Autor), wenn eine solche Zeile nicht gefunden wird, wird string zeile als neue Zeile in die Datei geschrieben. • Beachte: append ist aus set unmittelbar definierbar:append(string,zeile) = set(string,get(string)zeile) H. Werner : Datenalyse
Aufgabe 2 • Eine wichtige Hilfsfunktion ist makeStatistics(file), die die Datenzeilen (weder Kommentar noch Leerzeile) des Files einmal durchgeht und dabei die folgenden Eintragungen berechnet und einträgt: # sample_number = (Anzahl der Daten-Zeilen) # chanel_number = (Anzahl der Parameter i.e. Daten/Zeile) # sum_of_values = …,… (pro Spalte die Summe aller Werte) # sum_of_squares = …,… (pro Spalte die Summe der Quadrate aller Werte) # maximum_values = …,… (pro Spalte das Maximum aller Werte) # minimum_values = …,… (pro Spalte das Minimum aller Werte) # mean_values = …,… (pro Spalte der Mittelwert aller Werte sum_of_values / sample_number) H. Werner : Datenalyse
AWK • Eine sehr geeignete Sprache dafür ist awk (eine Erweiterung von sed in der UNIX-Welt), die auf command-line-Ebene automatisierte Veränderungen auf Textdateien durchführen kann. • http://www.ostc.de/awk.pdf enthält ein sehr gutes Tutorial. • Liest Dateien zeilenweise ein, zerlegt die Zeilen in Worte (Textstücke ohne Trenner) und interpretiert alle Worte, die Zahlen darstellen können als Zahlen. H. Werner : Datenalyse
AWK Arbeitsweise • Ein awk-Befehl (Regel) ist von der Bauart: awk MUSTER { AKTION } • Dabei steht MUSTER für einen Ausdruck, der für eine Textzeile wahr oder falsch sein kann (boolescher oder regulärer Ausdruck) • AKTION ist ein Programmstück, dessen elementare Operationen Textzeilen in gegebene Dateien schreiben. • Der Befehl wird ausgeführt, indem • nacheinender die Zeilen (Records) aus einer Textdatei gelesen werden. • Wenn die gelesene Zeile das Muster erfüllt, wird die Aktion auf diese Zeile angewendet. • Die Abarbeitung endet, wenn die gesamte Textdatei gelesen worden und jede zugehörige Aktion durchgeführt worden ist. • AWK schreibt immer in eine andere Datei als die, aus der sie liest, meistens stdout und stdin . H. Werner : Datenalyse
AWK eigene Variablen AWK hat eigene Variablen, die in Mustern und Aktionen verwendet werden Variable Beschreibung Default Symbol • $0 Ganzer aktueller Record keiner $0 • $1..$n Einzelne Felder keiner $1..$n • NF Zahl Felder im Record keiner n • FS Eingabe Feldseparator Space, Tab + • OFS Ausgabe Feldseparator Space keines • NR Nummer des akt: Record keiner keiner • RS Input Record Separator Newline / • ORS Output Record Separator Newline keiner • FILENAME Name der aktuellen Datei H. Werner : Datenalyse
AWK - Einzeiler • Anzahl Eingabezeilen ausgeben: • END { print NR } END ist wahr, wenn das Dateiende erreicht ist. • Gesamtzahl aller Felder (Wörter) aller Eingabezeilen ausgeben: • { nw += NF } END { print nw } • Alle nicht-Kommentarzeilen ausgeben • {$1 != “#“} {print $0} • Jede nichtleere Zeile ausgeben: • NF>0 • Jede Zeile mit ihrer Zeilennummer davor ausgeben: • {print NR,$0} H. Werner : Datenalyse
Leerzeichen • Leerzeichen, die in AWK Programmen fast überall stehen dürfen, sind unter Windows auf der AWK-Command-Line nicht möglich, weil CMD das Leerzeichen als Trenner für Parameter interpretiert. Die oben aufgeführten 1-Zeiler müssen also komprimiert oder ungeschrieben werden zu: • awk END{print(NR)} 1.dat • awk {nw+=NF}END{print(nw)} 1.dat • awk {if($0~/^#/);else{print($0)}} 1.dat • awk {if(NF!=0){print($0)}} 1.dat • awk {print(NR,$0)} 1.dat • awk {if(NF==0){print($0);}else{if($0~/^#/){print($0);}\ else{(zaehler+=1);print(zaehler,$0)}}} 1.dat H. Werner : Datenalyse
Einsatz • In einem Cmd-Fenster von Windows gehen wir in das Unterverzeichnis unserer Datenfiles. • awk muß im Pfad sein. • Wir geben einawk “{ print NR, $0 }“ pts.dat >ptsNr.dat 0 0 1 0 1 2 0 2 3 1 0 4 1 1 5 1 2 4 Pts.dat 1 0 0 1 2 0 1 2 3 0 2 3 4 1 0 4 5 1 1 5 6 1 2 4 ptsNr.dat H. Werner : Datenalyse
AWK Parameter • In AWK gibt es einen Parameter Übergabe Mechanismus, der über die speziellen Variablen ARGV und ARGC gesteuert wird • ARGV ist der Vektor aller Parameter des awk –Befehls. • ARGC ist die Anzahl der Parameter, also die Länge von ARGV. • ARGV[0] ist der Befehlsname awk • ARGV[1] … ARGV[ARGC-1] sind die Parameter, die nach dem eigentlichen Befehl aufgeführt werden • Der Befehl :awk {BEGIN {for ( i = 0; i < ARGC; i++ ) {print ARGV[i]}}} eins zwei dreigibt folgendes auf dem Bildschirm aus: awkeinszweidrei H. Werner : Datenalyse
AWK Parameter 2 • Ein alternativer Mechanismus ist die –v (value-) Option von awk. • Durch awk –v a=1 –v b=‘heinz‘ … werden im Befehl vor der BEGIN Sektion die Variablen a und b eingeführt und mit den Werten 1 bzw. heinz initialisiert. H. Werner : Datenalyse
Strings prüfen • Wie prüft man z.B., ob eine Zeile mit einem bestimmten String anfängt (z.B. # author) • Hier bieten sich reguläre Ausdrücke als Werkzeug an z.B. • $0 ~ /^# author/~ bedeutet „kommt vor in“^ steht für den Textanfang// ist die Einschlussklammer für reguläre Ausdrücke • ($1 == /#/) && ($2 == /author/)Beim voreingestellten Trennungszeichen wird # in $1 und author in $2 landen H. Werner : Datenalyse
AWK - Typen • Der wichtigste Datentyp von awk ist der String (Zeichenkette, Text), eine besondere Rolle spielen dabei die Worte, die keine white spaces enthalten. • awk wandelt nach Bedarf und Möglichkeit Worte in Zahlen (numerische Werte) um und auch umgekehrt. Die Ausdrücke a+0 bzw. a ““ (Konkatenation □) erzwingen die Interpretation als Zahl bzw. als String. • awk verwendet 0 und ““ als booleschen Wert FALSE und alle übrigen Werte als TRUE. H. Werner : Datenalyse
AWK Vektoren • Variablennamen haben keinen vorgegebenen Typ und können auch als Vektoren verwendet werden • Beispielfor (i = 1; i < NR; i++) eingabe[i]=$i; • Die Variable eingabe enthält nun gerade die Worte bzw. Zahlen, die in der aktuell eingelesenen Zeile stehen. • Solche Vektoren sind z.B. hilfreich, wenn die statistik-Zeilen erzeugt werden sollen H. Werner : Datenalyse
Beispiel • In einer Datei sollen vor jeden Record (Zeile mit numerischen Daten) die Record-Nummer geschrieben werden. • Inhalt der Datei RNzaehlen.awk : BEGIN {RN = 0} {if (($1>=0)||($1<=0)) {RN++ ; print RN , $0} else {print $0}} • Das Muster BEGIN ist nur vor dem Lesen des ersten records wahr, es wird eine Variable RN mit 0 initialisiert • Wenn die aktuelle Zeile $0 mit einem numerischen Wert $1 anfängt (ein Record), so wird RN inkrementiert und vor die vorhandene Zeile herausgeschrieben, andernfalls (ein Kommentar oder Leerzeile …) wird nur die vorhandene Zeile unverändert herausgeschrieben. • awk -f "RNzaehlen.awk" pts.dat >ptsRN.dat H. Werner : Datenalyse