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 einer txt-Datei in structure

 

Nras
Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 14.10.2013, 16:05     Titel: Einlesen einer txt-Datei in structure
  Antworten mit Zitat      
Hallo,

ich arbeite derzeit mit mehreren txt-Dateien, die allerdings unterschiedlich viele Spalten beinhalten können und habe mir für diese eine Routine zum Einlesen geschrieben. Diese Routine tut auch genau das, was sie soll und funktioniert einwandfrei. Hier der Auszug der wesentlichen Befehle (ohne Fehlerabfangen):

Code:
function [out, columnNames] = read_pr_data_from_day_fast(filename, startDay)
% READ_PR_DATA_FROM_DAY_FAST(filename, startDay)
% Benutzung:     [out, columnNames] = read_pr_data_from_day(filename, startDay)

% Default for startDay


% load file to read
fid = fopen(filename,'r');
if fid == -1
    out = NaN;
    columnNames = {' '};
    fprintf('invalid Filename!!!\nreturning out=%d and columnNames=%s\n',...
        out, columnNames{1})
    return
end

% check amount of given Columns from Headerline
tline = fgetl(fid);
[~, numOfCols] = sscanf(tline,'%s');

% ----- Read Column names from Header line
% delete '(1)' and use lowercase letters
idx = strfind(tline,'(');
idx = sort([idx, idx + 1, idx + 2]);
tline(idx) = [];
tline = lower(tline);

fprintf('Reading Header... \n')
tmp = textscan(tline,'%s \t ');   % delimiter is: space tab space
columnNames = tmp{1};   % return Nx1 Cell
fprintf('Reading Header finished \n')

% ----- Read and convert data to matrix -----
fprintf('Reading Data... \n')
out = textscan(fid,repmat('%f ',1,numOfCols),'headerlines',1+startDay);
out = cell2mat(out);
fprintf('Reading Data finished \n')
fclose(fid);
 


Nun wird mir allerdings das Hantieren mit diesen Matrizen viel zu aufwendig und ich hätte sie lieber als Struct der folgenden Form.
data(1).time
data(1).pc
.
.
.
data(1).licht

Soll heißen, ich hätte gerne automatisch die Felder gemäß der in columnNames gespeicherten Strings generiert, also ohne die störende '(1)' hinter den meisten Spalten und alles in Kleinbuchstaben (das ist bereits eingebaut).
Wenn ich nun eine weitere Datei einlese, würde ich die gerne als data(2) sichern, sodass ich zum Beispiel
Code:
plot(data(1).time,data(1).pc,data(2).time,data(2).pc

ausführen kann. Bisher müsste ich das zum Beispiel so machen
Code:
out1 = read_pr...('data1.txt')
out2 = read_pr...('data2.txt')
plot(out1(:,1),out1(:,3),out2(:,1),out2(:,3))

was einfach nur Mist ist und schon nicht funktioniert, sobald die zweite Spalte in einer der beiden Dateien fehlen würde...

Ich hoffe auf Hilfe,
viele Grüße.

test.txt
 Beschreibung:

Download
 Dateiname:  test.txt
 Dateigröße:  1.38 KB
 Heruntergeladen:  216 mal
Private Nachricht senden Benutzer-Profile anzeigen


Nras
Themenstarter

Forum-Meister

Forum-Meister


Beiträge: 608
Anmeldedatum: 21.02.12
Wohnort: ---
Version: 7.12.0.635 (R2011a)
     Beitrag Verfasst am: 14.10.2013, 16:25     Titel:
  Antworten mit Zitat      
Hallo,

ich hätte einfach noch weitersuchen sollen. Hier wird einem geholfen: http://www.mathworks.de/de/help/mat.....names-from-variables.html
Bei mir fehlte lediglich am Ende:
Code:
% ----- Now transform Data to structure
S.filename = filename;
for i = 1:numOfCols
    S.(columnNames{i}) = out(:,i);
end

und vielleicht geht das sogar noch besser, wer weiß das schon.
S ist dann der Rückgabewert der Funktion und mit dem Feld Filename weiß ich dann noch, woher die Daten stammen. Vielleicht geht es effektiver (ohne den Umweg über meine columnNames und out-Matrix, aber so funktioniert es auf jeden Fall und ist für mich nach der Vorarbeit wohl die kürzeste Variante.

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