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

.txt mit Header einlesen

 

clarke
Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.05.2012, 10:45     Titel: .txt mit Header einlesen
  Antworten mit Zitat      
Hallo,

ich bin absoluter Matlab-Neuling und bitte daher eventuelle dumme Fragen zu entschuldigen Smile

Zur Frage:

Ich möchte eine .txt Datei einlesen, die viele Messwerte gespeichert hat. Jedoch komme ich mit dem Header der Datei nicht klar. Der Inhalt der .txt sieht etwa so aus:

Zitat:
header
x-werte
100.00 ....
200.00 ...
...und wieder text


Ich möchte jetzt allerdings erstmal eine große Matrix auslesen, die sämtliche Spalten und Zeilen der Werte zwischen den beiden Text Feldern hat. Und genau daran scheitere ich bisher.

Vielen Dank.
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.05.2012, 11:37     Titel:
  Antworten mit Zitat      
Hallo,

du kannst TEXTSCAN mit der entsprechenden Anzahl an Kopfzeilen ('headerlines') verwenden.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2012, 10:35     Titel:
  Antworten mit Zitat      
Hallo,

danke für die schnelle Antwort. Ich möchte jedoch immer wieder andere Dateien einlesen, sodass die Headergröße variiert.
Gibt es nicht die Möglichkeit nach dem "x-wert" zu suchen und dann eine Zeile später mit der Matrix zu beginnen, bis man den string "... und wieder text" findet?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.05.2012, 11:23     Titel:
  Antworten mit Zitat      
Hallo,

du kannst zeilenweise mit FGETL einlesen und dann die Zeilen z.B. mit STRCMP mit einer gewünschten vergleichen.
Dann mit TEXTSCAN einlesen - das läuft automatisch, bis es was abweichendes findet, um das Ende musst du dir also keine Sorgen machen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 10:14     Titel:
  Antworten mit Zitat      
Hallo,

zu 'textscan' komme ich erst gar nicht. Ich habe bisher folgenden Code eingebaut:

Code:

clc
clear all

file = 'file.txt';

fid = fopen(file,'r');
z = 1;
zeile = fgetl(fid);

while ~strcmp(zeile(1:29),'              WIDERSPRUCH [m]')
    zeile = fgetl(fid);
    z = z +1;
end


bekomme da aber immer die Fehlermeldung

Zitat:
??? Error using ==> fgetl at 44
Invalid file identifier. Use fopen to generate a valid file identifier.

Error in ==> test2 at 9
zeile = fgetl(fid);


Da ich, wie eingangs erwähnt, mich nicht so gut mit Matlab auskenne, komme ich hier schon nicht weiter. Ich soll laut der Hilfe "fopen" verwenden, was ich aber bereits am Anfang zum Öffnen getan habe?! Sieht jemand, wo der Fehler liegt?

VG
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2012, 10:57     Titel:
  Antworten mit Zitat      
Hallo,

das bedeutet, dass MATLAB die Datei nicht findet. Bitte Dateinamen überprüfen. Falls die Datei nicht im selben Verzeichnis liegt, den vollen Pfad angeben.

Desweiteren: wenn die Anzahl der Leerzeichen vor Widerspruch mal variieren kann, könnte STRFIND helfen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 08.05.2012, 14:21     Titel:
  Antworten mit Zitat      
Harald hat Folgendes geschrieben:
das bedeutet, dass MATLAB die Datei nicht findet. Bitte Dateinamen überprüfen. Falls die Datei nicht im selben Verzeichnis liegt, den vollen Pfad angeben.


Hupps... peinlich, peinlich.

Also, ich bin jetzt tatsächlich bis zu meinem Datenblock gekommen, der sieht folgendermaßen aus:

Zitat:
661.706088806800 -0.877 0.869 2.640 1 1 0.038 2.484 0.35
691.621003065500 -0.924 0.923 2.646 1 1 0.031 2.576 0.36
692.644175904900 -1.100 1.099 2.644 1 1 0.030 2.576 0.43
718.549921638100 1.519 -1.506 2.640 1 1 0.032 2.576 -0.58
760.969596953300 -0.793 0.776 2.394 1 1 0.040 2.484 0.31
817.868827161400 0.931 -0.938 2.362 1 1 0.036 2.576 -0.36
867.480767363600 -0.986 0.984 2.477 1 1 0.041 2.576 0.38
867.561611113500 -0.665 0.662 2.474 1 1 0.042 2.576 0.26


usw. usf.

mit der folgenden while Schleife

Code:

i = 1;
while ~strcmp(zeile(1:10),'          ')
    data = strread(zeile,'%f');
   
        for j=1:8
            mat(i,j) = data(j);
        end
       
    zeile=fgetl(bbf);
    i=i+1;
    clear data
end
 


habe ich die Matrix "mat" so gefüllt, dass die Zahlen komplett dort drin stehen. Ich erhalte jedoch die Fehlermeldung

Zitat:
Index exceeds matrix dimensions.

Error in ==> test at 36
end



Ich verstehe es so, dass die while Schleife, solange keine leere Zeile (keine leeren ersten 10 Zeichen) gefunden werden durchläuft und die Matrix kontinuierlich füllt. Die Daten stehen ja auch komplett in 'mat'. Nur scheint er Probleme mit dem Beenden zu haben, eigentlich müsste die while Schleife doch mit Erreichen der leeren Zellen aufhören, oder?
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 08.05.2012, 16:11     Titel:
  Antworten mit Zitat      
Hallo,

mein Eindruck ist, dass das Lesen hier mit strread unnötig verkompliziert wird. Schau dir doch textscan an; damit kannst du den ganzen Block auf einmal einlesen - ohne Schleife oder dergleichen.

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
clarke
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 30
Anmeldedatum: 04.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 15.05.2012, 13:57     Titel:
  Antworten mit Zitat      
Hallo,

Harald hat Folgendes geschrieben:
Schau dir doch textscan an; damit kannst du den ganzen Block auf einmal einlesen - ohne Schleife oder dergleichen.



ja, das hat geholfen. Vielen Dank, Harald, für die schnelle und gute Hilfe.

Für spätere Leser, gelöst habe ich das Auslesen der Datei jetzt folgendermaßen:

Code:
clc
clear all

file = 'file.txt';

fid = fopen(file,'r');
z = 1;
zeile = fgetl(fid);

% Überspringen des Headers
while ~strcmp(zeile(1:29),'              WIDERSPRUCH [m]')
    zeile = fgetl(fid);
    z = z +1;
end

% Erste Zeile des Datenblocks wird erreicht
zeile=fgetl(bbf);

% Einlesen des kompletten Textblocks in {c}
c = textscan(fid,'%f %f %f %f %d %d %f %f %f');

fclose(fid);
end
 
Private Nachricht senden Benutzer-Profile anzeigen
 
randfee2
Forum-Anfänger

Forum-Anfänger


Beiträge: 16
Anmeldedatum: 21.05.12
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 21.05.2012, 01:43     Titel:
  Antworten mit Zitat      
Hi,

nur als Hinweis: Ich benutze für sowas immer "importdata", das überspringt irgendwelchen kram im header und wirft alles in eine Matrix. Finde ich für solche Aufgaben immer sehr schick.

Gruß
Arnie
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 21.05.2012, 12:24     Titel:
  Antworten mit Zitat      
Hallo

du kannst auch direkt mit TEXTSCAN den Header überspringen
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.499
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 21.05.2012, 21:24     Titel:
  Antworten mit Zitat      
Hallo,

in diesem Fall ging es meinem Verständnis nach darum, dass man in der Datei einen Block nach einer bestimmten Schlüsselzeile, deren Position man nicht kennt, einlesen möchte. Da dürfte die Kombination von FGETL und TEXTSCAN wirklich am besten sein.

Grüße,
Harald
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.