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

Einlesen & Bearbeiten von .txt file

 

stevie_g
Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 01.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 14:41     Titel: Einlesen & Bearbeiten von .txt file
  Antworten mit Zitat      
Hallo zusammen,

ich komme momentan bei einem Problem nicht weiter.
Ich habe eine relativ große Textfile, welche z.T. aus Strings besteht.
Hier einmal ein kurzer Beispielausschnitt:

Zitat:
$GNZDA,102740.00,26,01,2011,01,00*7E
$GNGGA,102739.80 ,5223.1323629,N,00942.7350485,E,1,17,0.6,112.534,M,,,,*28
$GNGGQ,102739.80,012611,5223.1323629,N,00942.7350485,E,1,17,3.115,112.534,M*11
$GNGLL,5223.1323629,N,00942.7350485,E,102740.00,A,A*78


Im Endeffekt möchte ich jetzt jedoch nur die Zeilen weiterverarbeiten, die mit "$GNGLL" beginnen.

Mein geplantes Vorgehen sah so aus, dass ich nach dem Einlesen des Textes eine for-Schleife durchlaufen lasse, die nach dem String am Anfang sucht und dann mein gesuchtest Element (i,5) heraussucht und eine neue Matrix damit füllt.

Ich scheitere jedoch schon am Einlesen der Daten. Zum einen an den teilweise vorhandenene Strings, sowie an der ungleichen Anzahl von Spalten. Wie kann man das am Besten lösen?

Ich hoffe auf eure Hilfe und mit bestem Dank im Vorraus
Private Nachricht senden Benutzer-Profile anzeigen


_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 01.02.2011, 15:11     Titel:
  Antworten mit Zitat      
Hallo stevie_g,
du könntest das einlesen und die Überprüfung nach dem Anfangsstring wie folgt lösen:
Code:

fid = fopen('test.txt','r');
while 1
    tline = fgetl(fid);
    if ~ischar(tline),   break,   end
    if strcmp(tline(1:6), '$GNGLL')
        %Textbearbeiten -> Zeile ist jetzt in tline enthalten
    end
end
fclose(fid);
 

oder alternativ mit regexp
Code:

fid = fopen('test.txt','r');
while 1
    tline = fgetl(fid);
    if ~ischar(tline),   break,   end
    if ~isempty(regexp(tline, '\$GNGLL', 'match', 'once'))
        %Textbearbeiten -> Zeile ist jetzt in tline enthalten
    end
end
fclose(fid);
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
stevie_g
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 01.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 16:00     Titel:
  Antworten mit Zitat      
_Peter_ hat Folgendes geschrieben:

Code:

fid = fopen('test.txt','r');
while 1
    tline = fgetl(fid);
    if ~ischar(tline),   break,   end
    if strcmp(tline(1:6), '$GNGLL')
        %Textbearbeiten -> Zeile ist jetzt in tline enthalten
    end
end
fclose(fid);
 


Hallo Peter,

vielen Dank für die schnelle Antwort. Worauf bezieht sich das "1:6"?
Wenn ich jetzt in deine Kommentarzeile bspw.
Code:
A (i,1) = tline (i,8)

einfüge, dann gibt er mir hinterher A = 5 zurück, also den ersten Wert der gewünschten Zahl. Wenn ich das richtig sehe, versteht er den Wert "5223.1323629" aber nicht als Zahl, sondern ist das achte Element der Zeile auch der achte char?!

Ich hoffe, ich habe mich im Eingangspost nicht missverständlich ausgedrückt: ich möchte aus den Zeilen, die wie o.g. beginnen sämtliche Zahlenwerte haben, um mit denen dann weiterrechnen zu können. Also aus der gesamten File nur ein paar ausgewählte Daten übernehmen, der Rest ist unwichtig für mich.
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 01.02.2011, 16:51     Titel:
  Antworten mit Zitat      
Hallo stevie_g,
Zitat:

Worauf bezieht sich das "1:6"?

Das sind die ersten 6 char elemente von tline, weil die Zeile als string eingelesen wird.
Folglich ist auch
Zitat:

ist das achte Element der Zeile auch der achte char?!

Diese Annahme richtig.

Was ich noch anmerken wollte. Generell würde ich dir von den beiden Methode die mit regexp empfehlen, weil dabei auch Leerzeichen am Zeilenanfang kein Problem wären. (Bei der strcmp-Methode hingegen schon, aber ich wollte dir beide Wege aufzeigen)

Angenommen wir wollen alle Zahlen aus der Zeile ausfiltern dann würde ich das einsetzen:
Code:

values = regexp(tline, '[0-9]+.[0-9]+', 'match');
 

Dadurch hast du alle Zahlen in values (cell array) stehen.(die 78 habe ich jetzt mal nicht beachtet weil die ja in Verbindung mit einem char steht.

Anspechen kannst du die Zahlen nach folgendem Prinzip:
Code:

values(1);    % Als cell

values{1};   % Als string

str2num(values{1});    % Als numeric
 

_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
stevie_g
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 01.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 17:18     Titel:
  Antworten mit Zitat      
Hallo Peter,

besten Dank für deine bisherige Hilfe.

Ich habe jetzt bisher mit deinem ersten Lösungsansatz herumexperimentiert.
Das Problem der Strings habe ich jetzt folgendermaßen gelöst:
Code:
 
if strcmp(tline(1:6), '$GNGLL')
  for n = 8:19
           if n ~= 12
               tline (i,n) = str2double(tline(i,n));
           end
  end
  A = tline (i,8) * 1000 + tline (i,9) * 100 + tline (i,10) * 10 + tline (i,11);
  % usw.
  D = A + B + C;
 


Also sehr laienhaft, aber es funktioniert bis hierhin und daher bin ich eigentlich soweit zufrieden. Momentan hakt es noch bei zwei Kleinigkeiten:
1.) Ich möchte den Wert "D" als Teil einer Matrix haben, also alle errechneten D's in einer finalen Matrix am Ende. Dazu würde sich vermutlich eine for-Schleife anbieten, wo genau muss ich die einsetzen?
2.) Diese Schleife sollte nach Möglichkeit nicht von 1:20350 laufen, sondern ich hätte es gerne etwas allgemeiner, ginge es, dass er die Dimension der Gesamtmatrix erkennt und dann "for = 1:ZEILEN" läuft o.ä.?

Mit bestem Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 01.02.2011, 17:36     Titel:
  Antworten mit Zitat      
Hallo stevie_g,

1.
Code:

D = [];
...
D(length(D)+1) = A + B + C;
 


2.Müsste sich dann ja erledigt haben.

3. Du solltest bei deiner Methode jedoch wissen, dass wenn sich an der Struktur der Datei etwas ändern, dein Code nichtmehr richtig funktionieren wird und du ihn mühsam anpassen musst. Von daher ist die regexp-Methode stabiler und dynamischer.
_________________

Gruß
Peter
_________________
goMatlab-Knigge - dran gehalten?!
Schon in den FAQ gesucht? Oder der MATLAB Hilfe?
Ist vielleicht bei den Skripten oder den Tutorials was für dich dabei?
Private Nachricht senden Benutzer-Profile anzeigen
 
stevie_g
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 4
Anmeldedatum: 01.02.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 01.02.2011, 17:43     Titel:
  Antworten mit Zitat      
Okay, perfekt. Jetzt läuft es. Vielen, vielen Dank. Die Hinweise nehme ich auch gerne mit.
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.