Uebung 01 Dateien
SS 2011H. Werner : DatenalyseÜbung 1 : 2 Rohdaten Einzeldaten Gemessene Daten liegen normalerweise als reelle Zahlen vor, d.h. computertechnisch meist als float bzw. long. Datensatz Ein Datensatz ist daher eine Folge (Zeile) fester Länge n von Zahlen und die Prozessdaten bilden wieder eine Folge von Datensätzen Datei Eine Rohdaten-Datei besteht damit aus einer Anzahl von Zeilen, die jeweils n Zahlen enthalten, die durch einen Trenner (Lehrzeichen, Komma o.ä.) voneinander getrennt sind. Zusatzinformationen Manchmal 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 3 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 4 Tag-Dateien Numerische Werte werden als Zeichenfolgen notiert, beim Einlesen müssen diese Zeichenfolgen wieder in numerische Werte umgewandelt (geparsed) werden. tag-Dateien Ein bewährtes Format sind die tag-Dateien (eine Vorstufe von XML), in denen die Daten in Elementen zusammengefasst werden. Elemente beginnen und enden mit jeweils einem Namensfeld (tag) der Form und, zwischen denen Daten und/oder weitere Elemente stehen. Die Namen sollen dem Leser hinweise zur Bedeutung der eingeschlossenen Daten und Elemente geben. XML Bei 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 5 Datei-header Als sehr nützlich haben sich Kommentarzeilen erwiesen, in dem allgemeine Informationen gesammelt werden. header Im 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 6 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 7 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 8 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) file nimmt 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 Konkatenation string zeile in diese Datei. append(string,zeile) file tut 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)
SS 2011H. Werner : DatenalyseÜbung 1 : 9 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 )
SS 2011H. Werner : DatenalyseÜbung 1 : 10 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. 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 11 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 12 AWK eigene Variablen AWK hat eigene Variablen, die in Mustern und Aktionen verwendet werden VariableBeschreibungDefaultSymbol $0Ganzer aktueller Recordkeiner$0 $1..$nEinzelne Felderkeiner$1..$n NFZahl Felder im Recordkeinern FSEingabe FeldseparatorSpace, Tab+ OFSAusgabe FeldseparatorSpacekeines NRNummer des akt: Recordkeinerkeiner RSInput Record SeparatorNewline/ ORSOutput Record SeparatorNewlinekeiner FILENAMEName der aktuellen Datei
SS 2011H. Werner : DatenalyseÜbung 1 : 13 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}
SS 2011H. Werner : DatenalyseÜbung 1 : 14 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
SS 2011H. Werner : DatenalyseÜbung 1 : 15 Einsatz In einem Cmd-Fenster von Windows gehen wir in das Unterverzeichnis unserer Datenfiles. awk muß im Pfad sein. Wir geben ein awk { print NR, $0 } pts.dat >ptsNr.dat Pts.dat ptsNr.dat
SS 2011H. Werner : DatenalyseÜbung 1 : 16 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 drei gibt folgendes auf dem Bildschirm aus: awk eins zwei drei
SS 2011H. Werner : DatenalyseÜbung 1 : 17 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 18 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
SS 2011H. Werner : DatenalyseÜbung 1 : 19 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.
SS 2011H. Werner : DatenalyseÜbung 1 : 20 AWK Vektoren Variablennamen haben keinen vorgegebenen Typ und können auch als Vektoren verwendet werden Beispiel for (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
SS 2011H. Werner : DatenalyseÜbung 1 : 21 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