Verfasst am: 14.01.2013, 14:41
Titel: Datei einlesen, aufteilen und durchsuchen
Hallo!
Bin verzweifelt auf der Suche nach einem Befehl bzw. Code der mir bei folgendem Problem hilft:
Ich habe eine Datei (hier als .txt hochgeladen), die ich in Matlab einlesen muss. Da sie aber keine gefestigte Struktur besitzt, kann ich es also zu anfangs nur öffnen (also fopen mit r - schon klar).
Danach gibt es einen Header der mit "END OF HEADER" begrenzt ist, jedoch keine bestimmte Zeilenanzahl besitzt (daher fällt wohl headerlines weg, oder?). Dh ich möchte den Header auslesen und irgendwie abspeichern und später auf die Größen 'L1 L2 C1 etc.' durchsuchen (diese Codes können beliebig viele sein, dh auf konstante Werte untersuchen funktioniert nicht, hier muss mit der Datenstruktur gearbeitet werden) und diese in einem struct abspeichern.
Der Teil unter dem Header ist regelmäßiger aufgebaut, sollte jedoch jeweils wenn eine neue Zeit (siehe Änderung der Dateistruktur, erste Zahl = Nummer des Satelliten) beginnt, in einer neuen Matrix abgespeichert werden. Das könnte ich - habe mir ja schon Gedanken gemacht - dann wahrscheinlich, sobald ich diesen Teil abgetrennt habe - mit textscan machen, oder? Problem hierbei: Anzahl der Zeilen und Daten nach der Zeitangabe unterschiedlich.
Ich habe mich jetzt schon einige Stunden gespielt und versucht einen Code zu schreiben, jedoch habe ich nichts annähernd brauchbares produziert und kann somit keinen Code zum Verbessern oder näheren Erklärung hochstellen.
Anbei noch ein Ausschnitt des Files das ich einlesen muss.
Observe.txt
Beschreibung:
Nur Ausschnitt, kann beliebig lang fortgesetzt werden
Nach unserer bisherigen Erfahrung sind wir zum Vertrauen berechtigt, daß die Natur die Realisierung des mathematisch denkbar Einfachsten ist. Albert Einstein
So wie die Datei aussieht, führt wohl kein Weg daran vorbei, das ganze Zeile für Zeile einzeln zu bearbeiten, also als zeilenmatrix einlesen, und dann schleife über alle Zeilen. Einzig die von dir schon erwähnte Trennung in Header und Rest geht.
Aber selbst da wirst du dann jede Zeile einzeln nach den entsprechenden Schlüsselworten bzw. Schlüsselstrukturen durchsuchen müssen.
_________________
LG
Martina
"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Danke für die schnelle Antwort.
Japp, das ist ein komplexeres Problem, deshalb habe ich wohl schon alles durchforstet was es zu durchforsten gibt ...
@ Martina: Wie würde die Trennung von Header und Rest aussehen?
Weil dann könnte ich ja theoretisch mit fgetl jede Zeile mit textscan (Danke, studi) durchsuchen ob da "Types of Observe" und "Interval" steht und aus dieser Zeile dann die anschließend auf die erwähnten Werte + Zeitintervall herauslesen.
Anschließend könnte ich jede Zeile im restlichen Teil untersuchen. Habe hierbei vergessen zu erwähnen, dass in der Zeile "Interval" der Zeitintervall steht, wo jeder neue Abschnitt beginnt. Dh ich müsste da dann immer nur die erste Zeile überprüfen und + Intervall rechnen. In dieser (ersten) Zeile kann ich dann wahrscheinlich auch (fast) ohne Probleme die Nummern der Satelliten (getrennt durch 'G' auslesen - außer, dass es wieder eine beliebige Anzahl sein kann ...).
Hallo,
zuerst Datei öffnen und so lange end of file nicht erreicht wurde (feof(fid) == 0) , per incrementiertem Zähler die Datei Zeilenweise einlesen.
Schon während dieses einlesens würde ich über
Code:
if ~isempty(strfind(dataLine{lineIndex},'END OF HEADER'))
trennZeile = lineIndex;
end
Habe jetzt die Lösung ... Ein bisschen Spielen und es funktioniert. DANKE!
Habe jetzt ein Cell Array für den Header, möchte dieses nun auf 'VERSION' untersuchen um dafür den Index zu bekommen und diesen Index dann auf '2.11' um die Version zu überprüfen. (Kann es sein dass Version eine bereits implementierte Funktion ist!? - aber sollte das Probleme machen als String!??)
So ähnlich sollte dann auch später die Types of Observation funktionieren: überprüfen auf 'TYPES OF OBSERVE' und dann jeweils überprüfen ob es eines der Typen ist - am besten wohl mit Switch und in einer While- oder for-Schleife.
Habe jetzt zum finden schon mehrere Funktionen verwendet:
* strcmp
* strfind
* strmatch
Nichts funktioniert, da er nichts findet.
Hier mein Code (wenn es was leichteres als die for-Schleife zum Header zu erstellen gibt ... bei NavFile ergibt es nur ein char Array und damit kann ich nicht viel anfangen, ist ja dann nur die letzte Zeile abgespeichert.
Zusätzliches Problem - ist ein Assignment und habe hier Vorgaben: Ich sollte zum Auslesen eine Funktion schreiben die den Filehandle auf die nach dem Header zurückgibt. Gibt es dafür auch eine Lösung?
Das heißt ich möchte eigentlich nur Einlesen bis "END OF HEADER" kommt, dann stoppt ja eigentlich fgetl dort und Matlab merkt sich die Zeile.
Wäre das dann so in die Art:
Sollte erwähnen, dass es grundsätzlich kaum mehr Probleme mit "normalen" Problemstellungen beim Programmieren gibt, aber ich mit FileHandling noch nicht viel zu tun hatte und deshalb ziemlich dumm dastehe ...
Einstellungen und Berechtigungen
Du kannst Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen. Du kannst Dateien in diesem Forum posten Du kannst Dateien in diesem Forum herunterladen
MATLAB, Simulink, Stateflow, Handle Graphics, Real-Time Workshop, SimBiology, SimHydraulics, SimEvents, and xPC TargetBox are registered trademarks and The MathWorks, the L-shaped membrane logo, and Embedded MATLAB are trademarks of The MathWorks, Inc.