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

Zwischen bestimmten Strings Koordinaten aus txt auslesen

 

Maik aus Magdeburg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2013, 04:51     Titel: Zwischen bestimmten Strings Koordinaten aus txt auslesen
  Antworten mit Zitat      
Hallo Matlabgemeinde ich habe folgendes Problem.

Ich habe folgende TXT-Datei (ist nur ein Auszug, die komplette Datei ist mehrere 1000 Zeilen lang).

In der Datei stehen Bildnummern, Punktnummern und Koordinaten.
An dem Punkt wo in zwei aufeinander folgenden Zeilen „PHO“ am Anfang steht beginnt jeweils ein neuer Datensatz wobei das zweite „PHO“ den Beginn des neuen Datensatzes markiert. Vom nächsten „doppelten PHO“ das erste „PHO“ beendet den Datensatz. Es stehen also in jedem Datensatz 3 Zeilen mit PHO am Anfang. Die Koordinaten stehen zwischen den „PHO“-Zeilen. Ein korrespondierendes paar Koordinaten zwischen 3 Zeilen „PHO“ hat immer die gleiche Anzahl.
Die Anzahl der Koordinaten variiert aber von Datensatz zu Datensatz
Benötigen tue ich nur die Koordinaten zum rechnen und die beiden Bildnummern (in den ersten beiden „PHO“-Zeilen) zum nummerieren der Lösungsdateien.

Ich möchte jetzt in einer Schleife für jeden Datensatz jeweils die zwei Koordinatenmatrizen herauslesen (die Punktnummer die vor den Koordinaten stehen benötige ich nicht) mit denen ich dann Berechnungen durchführen möchte. Finde ich eine Lösung, möchte ich die nach den beiden Bildnummern benennen.
Ich weiß zwar wie ich auf einzelne Elemente in den Zeilen zugreifen kann, jedoch habe ich noch nicht herausgefunden wie ich den Datensatz abschließe bzw. wie ich die Bildnummer in der Mitte des Datensatzes extrahieren kann.
Mein Lösungsansatz ist wie folgt.

Code:
fid = fopen('Koordinatenbsp.txt');
while ~feof(fid)
    line=fgetl(fid);
   
    for
        PHO = str(line(2:19));  % Zeile mit String PHO am anfang Auslesen, Gleicher string steht am Ende des Datensatzes für den Abbruch

        Photonumber1 = str2double(line(16:19));  % Bildnummer erstes Bild
        Bl(j,1) = str2double(line(13:21));  % x erstes Bild
        Bl(j,2) = str2double(line(23:31));  % y erstes Bild

        Photonumber2 = str2double(line(16:19));  % Bildnummer zweites Bild
        Br(j,1) = str2double(line(13:21));  % x zweites Bild
        Br(j,2) = str2double(line(23:31));  % y zweites Bild
        if line == PHO
            break;
        end
    end
    j = j + 1;
end


Im Anhang befindet sich ein Koordinatenbeispiel.

Hoffe Ihr könnt mir Helfen.

MFG

Koordinatenbsp.txt
 Beschreibung:

Download
 Dateiname:  Koordinatenbsp.txt
 Dateigröße:  3.17 KB
 Heruntergeladen:  313 mal


jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2013, 12:58     Titel:
  Antworten mit Zitat      
bei weitem nicht optimal, aber ich hab das mal schnell runtergetippt...
funktioniert ohne regex natürlich nur bei exaktem txt.

Code:
fid = fopen('Koordinatenbsp.txt');
j = 1;
k = 1;
while ~feof(fid)
    line=fgetl(fid);
    PHO = [];
    while ~feof(fid)
        if ~isempty(strfind(line,'PHO =OBS='))
            if (~isempty(PHO) && ~isempty(strfind(line,PHO(1:19))))
                PHO = [];
                line=fgetl(fid);
                continue;
            end
            if(isempty(PHO))
                PHO = line;
                PHO_work = line;
                m = 1;
                line=fgetl(fid);
                Bl(j,1) = str2double(line(13:21));  % x erstes Bild
                Bl(j,2) = str2double(line(23:31));  % y erstes Bild
                Photonumber1(k,m) = str2double(PHO_work(16:19));  % Bildnummer erstes Bild
                j = j + 1;
            else
                PHO_work = line;
                m = 2;
                Photonumber1(k,m) = str2double(PHO_work(16:19));  % Bildnummer 2. Bild
                k=k+1;
            end
        end
        line=fgetl(fid);
    end
end
Private Nachricht senden Benutzer-Profile anzeigen
 
Maik aus Magdeburg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.03.2013, 18:12     Titel:
  Antworten mit Zitat      
Hallo jurtsche, vielen Dank für die schnelle Hilfe.

Ich hätte das so nie hinbekommen, in Tagen nicht.
Das Programm funktioniert teilweise.
Es erstellt nachdem ich es nur minimal erweitert habe 3 Matrizen mit zwei Spalten.
Eine Matrix heißt Photonumber1, hier stehen jeweils die beiden Bildnummern eines Datensatzes in einer Zeile der Matrix drin.
In den anderen beiden Matrizen steht jeweils die erste Koordinate (x und y) eines Datensatzes für ein Bild in einer Zeile der Matrix drin. In der Matrix Bl die erste Koordinate des linken Bildes in Br die erste Koordinate des rechten Bildes.
Wie bekommt man das hin das er alle Koordinaten (ca. 5-7) des linken Bildes für einen Datensatz die Matrix Bl bzw. das er alle Koordinaten (ebenfalls ca. 5-7) des rechten Bildes für einen Datensatz in die Matrix Br schreibt. Dabei soll er nur die Koordinaten eines Datensatzes in die Matrix Bl bzw. Br schreiben.
Das Programm durchläuft alle Zeilen, trotzdem schreibt er nur die erste Koordinate eines Datensatzes in die Matrix Bl bzw. Br.
Nachdem ich damit gerechnet habe soll er die Koordinaten wieder überschreiben.

Hoffe ihr könnt mir helfen.

MFG


minmal erweitertes Programm von jurtsche
Code:
fid = fopen('Koordinatenbsp.txt');
j = 1;
k = 1;
while ~feof(fid)
    line=fgetl(fid);
    PHO = [];
    while ~feof(fid)
        if ~isempty(strfind(line,'PHO =OBS='))
            if (~isempty(PHO) && ~isempty(strfind(line,PHO(1:19))))
                PHO = [];
                line=fgetl(fid);
                continue;
            end
            if(isempty(PHO))
                PHO = line;
                PHO_work = line;
                m = 1;
                line=fgetl(fid);
                Bl(j,1) = str2double(line(13:21));  % x erstes Bild
                Bl(j,2) = str2double(line(23:31));  % y erstes Bild
                Photonumber1(k,m) = str2double(PHO_work(16:19));  % Bildnummer erstes Bild
                j = j + 1;
            else
                PHO_work = line;
                m = 2;
                line=fgetl(fid);
                Br(k,1) = str2double(line(13:21));  % x zweites Bild
                Br(k,2) = str2double(line(23:31));  % y zweites Bild
                Photonumber1(k,m) = str2double(PHO_work(16:19));  % Bildnummer 2. Bild
                k=k+1;
            end
        end
        line=fgetl(fid);
    end
end
 
jurtsche
Forum-Century

Forum-Century


Beiträge: 123
Anmeldedatum: 26.03.13
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 27.03.2013, 08:08     Titel:
  Antworten mit Zitat      
Code:

fid = fopen('Koordinatenbsp.txt');
j=1; k=1; l=1;
while ~feof(fid)
    line=fgetl(fid);
    PHO = [];
    while ~feof(fid)
        if ~isempty(strfind(line,'PHO =OBS='))
            if (~isempty(PHO) && ~isempty(strfind(line,PHO(1:19))))
                PHO = [];
                line=fgetl(fid);
                j=1; k=1;
                Bild(l).Bl = Bl;
                Bild(l).Br = Br;
                Bild(l).Photonumber1 = Photonumber(1);
                Bild(l).Photonumber2 = Photonumber(2);
                l=l+1;
                continue;
            end
            if(isempty(PHO))
                PHO = line;
                PHO_work = line;
                m = 1;
                line=fgetl(fid);
                Bl(j,1) = str2double(line(13:21));  % x erstes Bild
                Bl(j,2) = str2double(line(23:31));  % y erstes Bild
                Photonumber(k,m) = str2double(PHO_work(16:19));  % Bildnummer erstes Bild
                j=j+1;
            else
                PHO_work = line;
                m = 2;
                line=fgetl(fid);
                Br(k,1) = str2double(line(13:21));  % x zweites Bild
                Br(k,2) = str2double(line(23:31));  % y zweites Bild
                Photonumber(k,m) = str2double(PHO_work(16:19));  % Bildnummer 2. Bild
                k=k+1;
            end
        else
            if (m==1)
                Bl(j,1) = str2double(line(13:21));  % x erstes Bild
                Bl(j,2) = str2double(line(23:31));  % y erstes Bild
                j=j+1;
            else
                Br(k,1) = str2double(line(13:21));  % x zweites Bild
                Br(k,2) = str2double(line(23:31));  % y zweites Bild
                k=k+1;
            end
        end
        line=fgetl(fid);
    end
    Bild(l).Bl = Bl;
    Bild(l).Br = Br;
    Bild(l).Photonumber1 = Photonumber(1);
    Bild(l).Photonumber2 = Photonumber(2);
end
 


jetzt steht alles vom 1. datensatz in Datensatz(1)
also z.b. Datensatz(1).Bl oder Datensatz(1).Photonumber1
oder Datensatz(2).Br(2,2)

lg
Private Nachricht senden Benutzer-Profile anzeigen
 
Maik aus Magdeburg

Gast


Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.04.2013, 02:36     Titel:
  Antworten mit Zitat      
Hallo jurtsche, auch wenn es etwas gedauert hat, vielen Dank noch mal für die gute Hilfe.

Das Programm hat für die erste Anwendung nach einer kleinen Modifikation super Funktioniert.
Leider muss ich zugeben das ich selbst nach dem Einbau von vielen Breakpoints und arbeiten mit dem Debugger noch nicht vollends verstanden habe wie, bzw. warum das Programm funktioniert. Es läuft aber für die erste Anwendung super (wenn auch ohne die Structe, da ich mit denen nicht klar gekommen bin).
Ich habe jetzt noch einen zweiten Datensatz bekommen. Dieser ist jedoch andres aufgebaut und wollte ihn eigentlich zu dem ersten umschreiben, damit ich das alte Programm zum einlesen nehmen kann. Geht aber nicht mit dem Editor bzw. ist mühsam bei mehreren tausend Zeilen. Jetzt habe ich versucht das hier gepostete Programm umzuschreiben, aber ich krieg’s nicht hin.
Kriege das nur für den ersten Datensatz hin, danach driftet er aus dem rahmen.
Diesmal ist neben den Koordinaten, die Bildnummer in der jeweils dritten Schriftzeile eines Koordinatensatzes wichtig. Hier steht nach „PHO =OBS= die Bildnummer.
Der erste Beispiel-Koordinatensatz hat also insgesamt 23 Zeilen. Die Koordinatensätze sind unterschiedlich groß, haben also unterschiedlich Anzahl von Punkten.
Mein Problem ist das ich nicht weiß wie ich über Textzeilen springen ohne dabei wichtige Daten (Bildnummer) auszulassen.
Der neue Beispieldatensatz befindet sich im Anhang.

Code:

fid = fopen('Koordinatenbsp.txt');
j=1; k=1; l=1;
while ~feof(fid)
    line=fgetl(fid);
    PHO = [];
    while ~feof(fid)
        if ~isempty(strfind(line,'PHO =OBS='))
            if (~isempty(PHO) && ~isempty(strfind(line,PHO(1:19))))
                PHO = [];
                line=fgetl(fid);
                j=1; k=1;
                Bild(l).BK = BK;
                Bild(l).XG = XG;
                Bild(l).Photonumber1 = Photonumber(1);
                Bild(l).Photonumber2 = Photonumber(2);
                l=l+1;
                continue;
            end
            if(isempty(PHO))
                PHO = line;
                PHO_work = line+fid;
                m = 1;
                line=fgetl(fid);
                BK(j,1) = str2double(line(13:21));  % x Bild
                BK(j,2) = str2double(line(23:31));  % y Bild
                Photonumber(k,m) = str2double(PHO_work(16:19));  % Bildnummer erstes Bild
                j=j+1;
            else
                PHO_work = line;
                m = 2;
                line=fgetl(fid);
                XG(k,1) = str2double(line(14:24));  % X Global
                XG(k,2) = str2double(line(28:37));  % Y Global
                XG(k,3) = str2double(line(43:50));  % Z Global
                Photonumber(k,m) = str2double(PHO_work(16:19));  % Bildnummer 2. Bild
                k=k+1;
            end
        else
            if (m==1)
                BK(j,1) = str2double(line(13:21));  % x Bild
                BK(j,2) = str2double(line(23:31));  % y Bild
                j=j+1;
            else
                XG(k,1) = str2double(line(13:21));  % X Global
                XG(k,2) = str2double(line(28:37));  % Y Global
                XG(k,3) = str2double(line(43:50));  % Z Global
                k=k+1;
            end
        end
        if j~=0 && j==k
            Xio = 19.223;
            Etao = 4.128;
            c = 7910.336;

%          Berechnung( XG, BK, Xio, Etao, c, Photonumber )

            clear BK XG
            BK=[0 0];
            XG=[0 0];
        end
        line=fgetl(fid);
    end
    Bild(l).BK = BK;
    Bild(l).XG = XG;
    Bild(l).Photonumber1 = Photonumber(1);
    Bild(l).Photonumber2 = Photonumber(2);
end
 


Hoffe ihr könnt mir noch mal helfen.

MFG

Koordinatenbsp.txt
 Beschreibung:

Download
 Dateiname:  Koordinatenbsp.txt
 Dateigröße:  9.51 KB
 Heruntergeladen:  318 mal
 
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.