WICHTIG: Der Betrieb von goMatlab.de wird privat finanziert fortgesetzt. - Mehr Infos...

Mein MATLAB Forum - goMatlab.de

Mein MATLAB Forum

 
Gast > Registrieren       Autologin?   

Partner:




Forum
      Option
[Erweitert]
  • Diese Seite per Mail weiterempfehlen
     


Gehe zu:  
Neues Thema eröffnen Neue Antwort erstellen

Datei einlesen, aufteilen und durchsuchen

 

nusskipfaL
Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 14:41     Titel: Datei einlesen, aufteilen und durchsuchen
  Antworten mit Zitat      
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

Download
 Dateiname:  Observe.txt
 Dateigröße:  2.03 KB
 Heruntergeladen:  467 mal
Private Nachricht senden Benutzer-Profile anzeigen


studi
Forum-Anfänger

Forum-Anfänger


Beiträge: 15
Anmeldedatum: 11.08.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 14:48     Titel:
  Antworten mit Zitat      
Hallo,

versuch es mal mit fgetl und textscan und der Beschreibung auf dieser Seite
http://www.mathworks.co.uk/support/.....=SL&solution=1-8GY5QQ
_________________

Nach unserer bisherigen Erfahrung sind wir zum Vertrauen berechtigt, daß die Natur die Realisierung des mathematisch denkbar Einfachsten ist. Albert Einstein
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 14.01.2013, 14:56     Titel:
  Antworten mit Zitat      
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))
Private Nachricht senden Benutzer-Profile anzeigen
 
nusskipfaL
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 15:06     Titel:
  Antworten mit Zitat      
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 ...).
Private Nachricht senden Benutzer-Profile anzeigen
 
Mmmartina
Forum-Meister

Forum-Meister


Beiträge: 745
Anmeldedatum: 30.10.12
Wohnort: hier
Version: R2020a
     Beitrag Verfasst am: 14.01.2013, 15:54     Titel:
  Antworten mit Zitat      
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

nach dem entsprechenden Schlüssel suchen, um dann die Zeile zu haben, in der der Header zu ende ist.
Dannach fid wieder schließen.

Header sind dann die Zeilen 1 bis trennZeile und Daten trennZeile+1 bis Ende.
_________________

LG
Martina

"Wenn wir bedenken, daß wir alle verrückt sind, ist das Leben erklärt." (Mark Twain))
Private Nachricht senden Benutzer-Profile anzeigen
 
Sirius3
Forum-Guru

Forum-Guru


Beiträge: 441
Anmeldedatum: 12.11.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 14.01.2013, 22:53     Titel:
  Antworten mit Zitat      
Die eigentlichen Trenner sind ja die Zeilen mit den G:
Code:
content=fileread('Observe.txt');
[blocks, headers] = regexp(content,'^.*G[0-9]*\s*$','split','match','lineanchors','dotexceptnewline');
big_header = blocks{1};
blocks = cellfun(@(bl)sscanf(bl,'%f'),8,[])',blocks(2:end),'uniformoutput',false);
 


und dann noch je nach Bedarf, big_header und headers weiterverarbeiten.
Private Nachricht senden Benutzer-Profile anzeigen
 
nusskipfaL
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 11
Anmeldedatum: 14.01.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2013, 19:05     Titel:
  Antworten mit Zitat      
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.

Code:
FID = fopen('_PF12000B.12n', 'r+');

counter = 1;
while ~feof(FID)
    fileLine{counter} = fgetl(FID);
   
    if ~isempty(strfind(fileLine{counter},'END OF HEADER'))
        trennZeile = counter;
    end
   
    counter = counter + 1;
end

for j = 1:trennZeile % geht das einfacher?
    Header{j} = fileLine{j};
end

strcmp('RINEX VERSION / TYPE', Header) % Einer meiner Versuche, auch schon mit nur 'VERSION' versucht

NavFile = fileLine{trennZeile + 1:end}; % char array - ändern!?

fclose(FID);


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:

Code:
fileLine{counter} = fgetl(FID);

while ~strfind(fileLine{counter}, 'END OF HEADER')
    fileLine{counter} = fgetl(FID);
end


und FID ist der Rückgabewert?

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 ...
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen



Einstellungen und Berechtigungen
Beiträge der letzten Zeit anzeigen:

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
.





 Impressum  | Nutzungsbedingungen  | Datenschutz | FAQ | goMatlab RSS Button RSS

Hosted by:


Copyright © 2007 - 2025 goMatlab.de | Dies ist keine offizielle Website der Firma The Mathworks

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.