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

.ps4 Dateien auslesen

 

kilkenny
Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.01.2011, 23:10     Titel: .ps4 Dateien auslesen
  Antworten mit Zitat      
Hallo zusammen,

nach langem verzweifelten Probieren und erfolgloser Suche im Internet habe ich dieses Forum hier gefunden und hoffe, dass ihr mir vielleicht weiterhelfen könnt.
Um es gleich vorweg zu nehmen: Ich bin noch relativ unvertraut mit MATLAB, da ich erst angefangen habe es zu verwenden. Nichtsdestotrotz muss ich ein Program schreiben, dass .ps4 Dateien einliest.
Zu dem Dateiformat: Es ist möglich diese Post Scripts mit einem Texteditor zu öffnen und das ganze dann zu dorchforsten. Deshalb habe ich zum öffnen in MATLAB:
text = fopen('/Users/---/---/---/1_1.ps4','r');
verwendet.
Nun sehen die Datein so aus, dass sich im Quelltextkopf Angaben zum Erstellungszeitpunkt des Files befinden, die für mich uninteressant sind.
Desweiteren folgt der Code für das in der Datei eingebettete Bild, der wiederrum nicht interessiert.
Ab Zeile 20000 oder so (variiert von Datei zu Datei) befinden sich jetzt die Textzeilen, die von Interesse sind.

Und zwar handelt es sich bei den Dateien um Satellitenbildaufnahmen, aus denen Orbit und Frame extrahiert werden und später in den Filename des aus der Datei ausgeschnittenen Bildes eingebunden werden sollen.

Code:
%Hier ist mal ein kleiner Textauszug:
(ERS-1 SAR PRI) show grestore gsave 420 27027 translate 0 0 M
2.12132 dup scale
(Andaman Sea) show grestore gsave 420 26136 translate 0 0 M
1.06066 dup scale
(orbit: 24884) show grestore gsave 420 25542 translate 0 0 M
1.06066 dup scale
(frame: 3129) show grestore gsave 420 24948 translate 0 0 M
1.06066 dup scale
(date:  04.04.1997) show grestore gsave 420 24354 translate 0 0 M
1.06066 dup scale
(time:  04:15 UTC) show grestore gsave 420 23463 translate 0 0 M
0.848528 dup scale
(tape:  CD1/1) show grestore gsave 10500 26136 translate 0 0 M
0.707107 dup scale -1811.66 0 N
(corner coordinates:) show grestore gsave 10500 25690 translate 0 0 M
0.601041 dup scale -3374.36 0 N
 

Was ich jetzt möchte ist, Die Zahl hinter Orbit, Frame, Date, Time, Tape usw. abzuspeichern, wobei deren Länge variieren kann.
Da ich mich mit dem Befehl textscan und dessen format leider noch gar nicht auskenne bitte ich euch um einen kleinen Tipp, wie ich an die Sache rangehen kann.


Vielen Dank schonmal im vorraus und viele Grüße!!

Kilkenny
Private Nachricht senden Benutzer-Profile anzeigen


kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2011, 00:33     Titel:
  Antworten mit Zitat      
Hallo nochmal,
was ich bis jetzt im Forum ruasgefunden habe, ist, dass ich ja evtl. strmatch benützen könnte oder findstr um erst mal auf den gewünschten Namen zu kommen und anschließend die Zahl dahinter auszulesen. Aber wie ich das genau machen muss weiß ich nicht....

Viele Grüße
Kilkenny

Code:

text = textscan(fid, '%s','Headerlines',10000)
k=1;
while(1)
   linn=fgetl(fid);
 if (findstr(linn,'orbit')>=1)
     break;
 else
     k=k+1;
 end
end
 
[/b]
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 20.01.2011, 11:01     Titel:
  Antworten mit Zitat      
Hallo kilkenny,

du könntest das mit einem regular expression lösen:
Code:

str = '(orbit: 24884) show grestore gsave 420 25542 translate 0 0 M 1.06066 dup scale';
names = {'orbit: ', 'frame: ', 'time: ', 'tape: '};
values = regexp(str, [names(1) '[0-9]+'], 'match', 'once');
number = values(2)
 

_________________

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
 
kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2011, 11:07     Titel:
  Antworten mit Zitat      
Hey Peter,
vielen Dank für die schnelle Antwort!!!
Mein Problem ist, dass sich Orbit, Frame, usw. in jedem File ändern.
Geht es vielleicht irgendwie, dass ich mit strmatch quasi die Parameter suche und danach mit textscan den nachfolgenden Wert einlese?


Viele Grüße Kilkenny
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 20.01.2011, 11:09     Titel:
  Antworten mit Zitat      
Wie meinst du das? was genau ändert sich jetzt? die Zahl die nach 'orbit' kommt? Dann funktioniert der Code.

Oder ändert sich auch der string 'orbit'? dann wird das auch mti strmatch schwierig wenn das immer anders ist, weil wonach soll man dann suchen wenn die Namen immer anders sind?
_________________

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
 
kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2011, 12:09     Titel:
  Antworten mit Zitat      
Wie ich das verstanden habe, ist dass dein Code im String str nach den unten deklarierten names sucht und dann den ersten Zahlenstring in number reinschreibt oder?

Wie mache ich das denn bei der Uhrzeit bzw. Datum, also bei den Strings, die mit Zeichen voneinander getrennt sind?

Viele Grüße und Danke!

kilkenny

Code:

(date:  04.04.1996) show grestore gsave 420 24354 translate 0 0 M
1.06066 dup scale
(time:  04:04 UTC) show grestore gsave 420 23463 translate 0 0 M
0.848528 dup scale
 

[/b]
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 20.01.2011, 12:40     Titel:
  Antworten mit Zitat      
Ja genau, du hast es richtig verstanden.

War mein Fehler, habe Datum überlesen. Folgendes müsste für alle funktionieren.

Hier die neue Zeile:
Code:

regexp(str, [names(1) '([A-Z]|[0-9]+)(.|:)?[0-9]+((.|:)?[0-9]+|\s?[A-Z]*)'], 'match', 'once')
 


Sorry aber ich bin ein bisschen regexp geschädigt Wink
_________________

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
 
kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2011, 12:49     Titel:
  Antworten mit Zitat      
Super, vielen Dank dafür!
Was jetzt aber leider noch nicht klappt, ist, dass MATLAB die Zahl nach dem Parameter liest. Vielmehr benützt es die erste Zahl, die es findet und geht auch nicht alle NAMES durch.

Im Moment versuche ich mich damit, aber wie du sehen kannst ist alles noch sehr sehr Laienhaft und ich komm nicht wirklich voran. Was also nicht klappt ist das Einlesen der Datei in einen String....hast du noch einen Tipp für mich?
Vielen vielen Dank!!
Code:

fid = fopen('/Users/---/---/samples/1_1.ps4','r');
if fid < 0, error('Das File ist nicht vorhanden');
        end
    txt = fscanf(fid, '%s');  % Einlesen der Textdatei als String
%str = '(orbit: 24884) show grestore gsave 420 25542 translate 0 0 M 1.06066 dup scale (frame: 3429) show grestore gsave 420 24948 translate 0 0 M 1.06066 dup scale (date:  04.04.1996) show grestore gsave 420 24354 translate 0 0 M'

names = {'orbit: ', 'frame: ', 'time: ', 'tape: '};
values = regexp(txt, [names(2), '([A-Z]|[0-9]+)(.|:)?[0-9]+((.|:)?[0-9]+|\s?[A-Z]*)'], 'match','once');
number = values(2)
 
Private Nachricht senden Benutzer-Profile anzeigen
 
kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.01.2011, 15:16     Titel:
  Antworten mit Zitat      
Hallo ein weiteres Mal,
ich habe jetzt nach unzähligen Versuchen ein Ergebnis bekommen, allerdings erscheint es mir nicht allzu elegant. Das Problem ist auch, dass ich keine Uhrzeit bzw. kein Datum damit auslesen kann...
Wäre über Hilfe sehr sehr dankbar!



Code:

%%.ps4 importieren
    fid = fopen('/Users/-----------------------/500.ps4','r');
         if fid < 0, error('Das File ist nicht vorhanden');
         end
    txt = fscanf(fid, '%s');  % Einlesen der Textdatei als String
   
   
      satellite2 = 'ERS-2'
    satellite = regexp(txt,'(ERS-(\d*))','tokens'); % Satellit suchen
    satellite = [satellite{:}]
    if strcmp(satellite, satellite2) >=1
        satellite= 'ERS2'                           % Satellitenabkürzung formatieren
    else satellite ='ERS1'
    end
   
    orbit = regexp(txt,'orbit:(\d*)','tokens'); % Orbit suchen
    orbit = [orbit{:}]
 
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 20.01.2011, 15:30     Titel:
  Antworten mit Zitat      
ich hatte oben noch einen kleinen Fehler drin, er hat nach 2 Werten gesucht und nicht nach einem.

Mit folgendem Code kann ich die Textdatei auslesen und habe die Informationen in einem struct.

Eventuell müsstest du eine Endlosschleife programmieren mit entsprechender Abbruchbedingung.
Aber das müsste dir wieterhelfen:

Code:

fid = fopen('test.txt', 'r');  
names = {'orbit', 'frame', 'time', 'tape', 'date'};
for i = 1: 10
    tline = fgetl(fid);
    first_word = regexp(tline, '[a-z]+', 'match', 'once');
    if ismember(first_word, names)
        value = regexp(tline, '([A-Z]|[0-9]+)(.|:)?[0-9]+((.|:)?[0-9]+|\s?[A-Z]*)', 'match', 'once');
        informations.(first_word) = value;
    end
end
fclose(fid);
disp(informations);
 

_________________

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
 
kilkenny
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 13
Anmeldedatum: 19.01.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 22.01.2011, 13:10     Titel:
  Antworten mit Zitat      
Hallo Peter,
vielen herzlichen Dank für die Mühen die du dir gemacht hast!
Mein jetziges Programm sieht so aus:
Code:

%%.ps4 importieren
    fid = fopen('/Users/----------------/500.ps4','r');
         if fid < 0, error('Das File ist nicht vorhanden');
         end
    txt = fscanf(fid, '%s');  % Einlesen der Textdatei als String
   
 %%%%%%%%%%%%%%
names = {'orbit', 'frame', 'time', 'tape', 'date'};
for i = 1: 10
    tline = fgetl(fid);
    first_word = regexp(tline, '[a-z]+', 'match', 'once');
    if ismember(first_word, names)
        value = regexp(tline, '([A-Z]|[0-9]+)(.|:)?[0-9]+((.|:)?[0-9]+|\s?[A-Z]*)', 'match', 'once');
        informations.(first_word) = value;
    end
end
fclose(fid);
disp(informations);

%%%%%%%%%%%%%%%%
satellite2 = 'ERS-2'
    satellite = regexp(tline,'(ERS-(\d*))','tokens'); % Satellit suchen
    satellite = [satellite{:}]
    if strcmp(satellite, satellite2) >=1
        satellite= 'ERS2'                           % Satellitenabkürzung formatieren
    else satellite ='ERS1'
    end

fclose(fid);
disp(informations);

name=[satellite,'_SAR_',informations.orbit,'_',informations.frame,'.jpg']%Als Test
 

Komischerweise hat der ganze Spaß gestern in der Uni funktioniert, heute zuhause spuckt MATLAb aber jetzt immer eine Fehlermeldung aus, auch wenn ich statt einer .ps4 Datei ein .txt-File einlese.

Der Fehler lautet:
Code:

??? Undefined function or method 'regexp' for input arguments of type 'double'.

Error in ==> cutoutuni at 44
    first_word = regexp(tline, '[a-z]+', 'match', 'once');
 

Hab herausgefunden, dass der Fehler auftritt, wenn die Funktion nicht im gleichen "workingspace" aufgerufen wird wie mein .m file liegt. Allerdings weiß ich nicht warum sich das Ganze geändert hat bzw. wie ich die Funktion vom gleichen .m-File starte.
addpath('/Applications/MATLAB_R2010a.app/toolbox/matlab/strfun/') habe ich schon probiert...ohne Erfolg.

Kann es sei, dass ich die TOOLBOX STRFUN installieren muss obwohl dein erstes Programm am Donnerstag noch lief?

Wäre Dir sehr sehr dankbar, wenn du mir noch einmal helfen könntest!!!

Schönes Wochenende

Kilkenny
Private Nachricht senden Benutzer-Profile anzeigen
 
_Peter_
Moderator

Moderator


Beiträge: 537
Anmeldedatum: 08.12.10
Wohnort: ---
Version: 7.10, 2010a
     Beitrag Verfasst am: 24.01.2011, 11:02     Titel:
  Antworten mit Zitat      
Nur um die Verbindung herzustellen.
Das Problem wird in folgendem Thread weiterbehandelt:

http://www.gomatlab.de/undefined-fu.....nput-argument-t16298.html
_________________

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
 
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.