Verfasst am: 21.09.2009, 22:28
Titel: Mal wieder txt-Files einlesen
Moin Moin,
ich habe ein hoffentlich kleines Problem mit dem Einlesen verschiedener txt-Dateien. Um es kurz zu machen, so sehen die Files grundsätzlich aus:
text text text
text text text
name1 name 2 name3
text text text
text text text
1 2 3
1 2 3
1 2 3
1 2 3
1 2 3
Ich habe also 5 Headerlines, wovon in der dritten stets die Variablennamen stehen. Ab der sechsten Zeile kommen dann die Daten (Spaltenweise für jede Variable). Ich würde gerne jede Variable mit Namen (name1) und den Daten (1 1 1) abspeichern.
Grundsätzlich weiß ich auch nicht, wie viele Variablen in dem File vorhanden sind. Das ist mein eigentliches Problem. Hat jemand eine Ahnung, wie ich das für jeden Fall über ein m-file einlesen kann?
ich würde die 3. Zeile mit fgetl einlesen und analysieren. Z.B. Anzahl der Leerzeichen abfragen und daraus die Anzahl der Spalten schließen ( = N ) . Dann kann mit textscan arbeiten, und z.B. einem Formatstring repmat(%f, 1, N).
Viele Grüße,
Harald
Gast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.09.2009, 14:39
Titel:
Hallo,
danke für den Hinweis. Mit der Funktion "fgetl" habe ich es geschafft. Für alle, die ähnliche Probleme haben, schreibe ich mal den Code auf, mit dem ich die Geschichte umgesetzt habe:
Code:
% Definition der Zeile, in der sich die Variablennamen befinden
zeile=3;
% Definition Anzahl Headerlines
headerlines=5;
% Öffnen der Datei
fid=fopen('Testfile.txt');
for i=1:zeile
tline = fgetl(fid);
if i==zeile
% Hier wird geprüft, an welchen Stellen Leerzeichen, bzw. Tabs sind
s2 = regexp(tline, '\s') end end % Aus der Anzahl Leerzeichen wird das Format für Textscan gebildet (Anzahl Spalten) for i=1:length(s2) if i==1 format(1,1:2)='%s';
else format(1,end+1:end+3)=' %s';
end end
C = textscan(fid,char(format),'headerlines',headerlines,'delimiter','\t') fclose(fid);
% Hier werden die Variablennamen mit dem zugehörigen Datenvektor in den Workspace geschrieben. for i=1:length(s2) if i==1 assignin('base',tline(1:s2(1)-1),str2double(regexprep(C{1}, ',', '.')));
else assignin('base',tline(s2(i-1)+1:s2(i)-1),str2double(regexprep(C{i}, ',', '.')));
end end
Ah, auch noch mit Komma als Dezimaltrennzeichen... sowas macht dann natürlich erst recht "Freude". Aber es hat ja geklappt
Grüße,
Harald
Einstellungen und Berechtigungen
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
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.