Einlesen von txt-Dateien aus mehreren Ordner + div. Perioden
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 19.05.2017, 11:26
Titel: Einlesen von txt-Dateien aus mehreren Ordner + div. Perioden
Hallo!
Ich bin schon seit längerer Zeit auf der Suche, wie ich txt-files aus verschiedenen Ordnern einlesen kann, wobei hierbei nur verschiedene Perioden eingelesen werden sollten.
Die Inputfiles haben folgendes Format
%Datetime Firn Ice Rock Snow Soil Total
01.10.2013-00:00 -0.0000 -0.0000 -0.0000 -0.0000 0.1500 0.1500
wobei nur die erste und letzte Spalte relevant sind (also Datetime und Total).
Die Ordner haben folgendes Format name_(fortlaufende_Nummer).
Anbei mein bisher aufgesetzter Quellcode:
Code:
function[Y]=modell_MulObj(x) % diese Funktion berechnet mehrere Modell-Performance Maße % es werden die Ergebnisse aus der Clusterrechnung eingelesen und gegen die % gemessenen Werte evaluiert, hierbei werden die Winterhalbjahre nicht % berücksichtigt % dh. betrachtete Perioden 1.05 bis 30.09. des jeweiligen Jahres % Output sind die Performancemaße
M = 31; %Anzahl der Parameter
x = x(:);
if ~isnumeric(x); error('input argument "param" must be numeric');
end iflength(x)~=M; error('input argument "param" must have %d componentes',M);
end
% Definition der zu evaluierenden Perionden % 1. Mai 2014 bis 30. September 2014 % 1. Mai 2015 bis 30. September 2015 % 1. Mai 2016 bis 30. September 2016
modell_MulObj sollte nun aus zwei mal 5000 und einmal 155.000 Inputfiles jeweils die Performance-Maße für die Sommerhalbjahre erstellen und in Matrizen YA, YB und YC abspeichern. Pro Inputfile sollte für das jeweilige Performance-Maß ein Wert abgespeichert werden. YA sollte schlussendlich 5000 Zeilen und 3 Spalten haben, YB 5000 Zeilen und 3 Spalten und YC 155.000 Zeilen und 3 Spalten.
Aufgerufen wird die Funktion über
YA = modell_MulObj
YB = modell_MulObj
YC = modell_MulObj
Mein Lösungsansatz:
- for Schleife über die Anzahl der in model_standalone abgelegten Ordner
- öffnen der einzelnen Ordner
- einlesen des Files im jeweiligen Ordner
- Berechnung durchführen
- abspeichern in YA,... je nach getätigtem Aufruf
Verfasst am: 19.05.2017, 16:46
Titel: Re: Einlesen von txt-Dateien aus mehreren Ordner + div. Peri
Hallo meteoGast,
Zitat:
Mein Lösungsansatz:
- for Schleife über die Anzahl der in model_standalone abgelegten Ordner
- öffnen der einzelnen Ordner
- einlesen des Files im jeweiligen Ordner
- Berechnung durchführen
- abspeichern in YA,... je nach getätigtem Aufruf
Das klingt doch ganz gut. Was ist nun genau Deine Frage? Sollen wir Dir eine FOR-Schleife schreiben?
Versuche es erst mal selbst, und wenn ein konkretes Problem auftritt, poste den Code und erklären, was nicht funktioniert.
Gruß, Jan
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 20.05.2017, 16:24
Titel:
Hallo Jan,
fein wenn mein Lösungsvorschlag gut klingt, aber wie konkret kann die zeitliche Eingrenzung umgesetzt werden und das Öffnen einzelner files aus unterschiedlichen Verzeichnissen?
Gruß, meteoGast
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 21.05.2017, 16:05
Titel: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner + div.
Hallo,
unten meine Überlegungen zur Umsetzung der Schleife inkl. der zeitlichen Abgrenzung.
Code:
% ermitteln der Länge an einzulesenden Inputfiles
D = dir('C:\Users\heute\results\model_standalone\');
Num = length(D);
% einlesen der Messwerte - Abfluss (vom 1. Oktober 2013 bis 30. September % 2016) [DD,MM,YY,hh,mm,seeausfluss]=textread('seeausfluss_13_15.txt','%u %*1c %u %*1c %u %u %*1c %u %f', -1,'delimiter',' ','headerlines',16);
ss=00;
date_seeausfluss=datenum(YY,MM,DD,hh,mm,ss);
Qo = seeausfluss;
for i = 1:Num;
[Date,QSfirn,QSice,QSrock,QSsnow,QSsoil,Qs]=textread('D\u_results(i)\runoff.txt','%s %f %f %f %f %f %f',-1,'headerlines',1);
% erzeugen eines Date-Vektors mit der Dimension von QS
sdatelim_neu = [datenum(2013,10,01,00,00,00)datenum(2016,10,01,00,00,00)];
dt = 1/24;
date = sdatelim_neu(1):dt:sdatelim_neu(2);
date_runoff = transpose(date);
Das Rechnen funktioniert leider nocht nicht, da das Aufrufen der jeweiligen runoff.txt files aus den fortlaufend nummerierten u_results-Ordner nicht läuft. Der textread - Befehl funktioniert auf jeden Fall, wenn man nur ein einzelnes file einliest.
Zusätzlich sollte das Programm automatisch erkennen ob der Aufruf YA = modell_MulObj, YB =... usw. lautet und somit die Matrizen YA, YB und YC gemeinsam ausgeben.
Wie könnte dies in die for-Schleife implementiert werden?
Verfasst am: 23.05.2017, 13:11
Titel: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner + div.
Hallo meteoGast,
Zitat:
unten meine Überlegungen zur Umsetzung der Schleife inkl. der zeitlichen Abgrenzung.
Ich weiß nicht, was "zeitliche Abgrenzung" bedeutet.
Zitat:
Das Rechnen funktioniert leider nocht nicht, da das Aufrufen der jeweiligen runoff.txt files aus den fortlaufend nummerierten u_results-Ordner nicht läuft.
Da kann ich nichts sinnvolles drauf antworten. Bitte zeige die entsprechenden Zeilen und erkläre, was "läuft nicht" explizit bedeutet.
Zitat:
Zusätzlich sollte das Programm automatisch erkennen ob der Aufruf YA = modell_MulObj, YB =... usw. lautet und somit die Matrizen YA, YB und YC gemeinsam ausgeben.
Das ist nicht nachvollziehbar.
Denke daran, dass die Leser im Forum nicht die geringste Ahnung von dem haben, was Du machst. Im gezeigten Code ist nicht ersichtlich, was schon läuft, was noch nicht, und wo Du etwas ändern möchtest.
Ich rate mal wild, dass dies Dir weiter helfen könnte:
Code:
Folder = 'C:\Users\heute\results\model_standalone\';
D = dir(Folder);
Num = length(D);
for iFile = 1:Num
aFile = fillfile(Folder, D(iFile).name);
[DD,MM,YY,hh,mm,seeausfluss]=textread(aFile,'%u %*1c %u %*1c %u %u %*1c %u %f', -1,'delimiter',' ','headerlines',16);
... end
Falls das hilft, hätte eine Suche im Internet nach "Matlab process sequence of files" geholfen.
Bitte erkläre jetzt nochmal so knapp wie möglich, aber mit allen benötigten Details:
Zitat:
erkennen ob der Aufruf YA = modell_MulObj, YB =... usw. lautet
Gruß, Jan
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 23.05.2017, 15:44
Titel: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner + d
Hallo Jan,
vielen Dank für die Hilfestellung. Tut mir leid, dass ich die Probleme nicht klar auf den Punkt gebracht habe.
Generell sollten aus einem Verzeichnis txt-Dateien eingelesen werden. Alle txt-files haben denselben Namen, liegen aber immer in einem anderen Unterordner, dessen Name sich durch eine fortlaufende Nummer unterscheidet. Der genaue Speicherpfad lautet wie folgt:
Diese txt-Dateien enthalten Simulationsergebnisse, welche mit Messwerten verglichen werden sollten. Aus diesen werden dann NSE, RMSE etc. berechnet um die Performance der einzelnen Modellläufe zu bewerten.
Die Berechnung der einzelnen Maße sollte nur für verschiedene Perioden laufen, also zum Beispiel vom 1. Mai 2013 bis 30. September 2013, 1. Mai 2014 bis 30. September 2014, etc.
Für jedes txt-file sollte schlussendlich aus allen Periodenein NSE, ein RMSE etc. berechnet werden. Dieser Messwert sollte dann in einer Matrix abgelegt werden. Diese lautet zB YA und sollte dann die folgenden Dimensionen haben: 5000 Zeilen (entspricht der Anzahl der txt-files) und zB 3 Spalten (eine für NSE, eine für RMSE und eine für den BIAS).
1.)
Zitat:
Ich weiß nicht, was "zeitliche Abgrenzung" bedeutet.
verschiedene Zeiträume, habe versucht dies innerhalb einer for-Schleife umzusetzen:
Zuerst habe ich hier die einzelnen zeitlichen Grenzwerte definiert und lasse dann die Berechnung von NSE, RMSE und BIAS in einer for-Schleife für die einzelnen Perioden laufen und schreibe dies abschließend in die Matrix YA.
2.)
Zitat:
Das Rechnen funktioniert leider nocht nicht, da das Aufrufen der jeweiligen runoff.txt files aus den fortlaufend nummerierten u_results-Ordner nicht läuft. Da kann ich nichts sinnvolles drauf antworten. Bitte zeige die entsprechenden Zeilen und erkläre, was "läuft nicht" explizit bedeutet.
Code:
D = dir('C:\Users\heute\results\model_standalone\');
Num = length(D);
for i = 1:Num;
[Date,QSfirn,QSice,QSrock,QSsnow,QSsoil,Qs]=textread('D\u_ordner(i)\runoff.txt','%s %f %f %f %f %f %f',-1,'headerlines',1);
Das sind die Zeilen, die ich geschrieben habe, um das jeweilige file aus den einzelnen u_ordner einzulesen. Das Problem liegt daran, dass die einzelnen Unterordner nicht aufgerufen werden können und in weiterer Folge die txt-files nicht eingelsen werden können. Der hier angegebene Speicherpfad stimmt mit dem tatsächlichen Speicherplatz überein, vermut dass das Problem innerhalb des textread-Befehls liegt?
3.)
Zitat:
Zusätzlich sollte das Programm automatisch erkennen ob der Aufruf YA = modell_MulObj, YB =... usw. lautet und somit die Matrizen YA, YB und YC gemeinsam ausgeben.
Generell wird die im modell_MulObj.m geschriebene Funktion:
function [Y]=modell_MulObj
in einem externen Programm mittels Befehl YA = modell_MulObj aufgerufen.
Weitere Aufrufs-Optionen sind YB = modell_MulObj und YC = modell_MulObj.
Der Unterschied zwischen den drei Aufrufen liegt darin, dass in YA 5000 runoff.txt files, in YB weitere 5000 runoff.txt files und in YC 155.000 runoff.txt files ausgewertet werden müssen.
Jetzt sollte innerhalb der Funktion modell_MulObj unterschieden werden ob der Auftruf mit YA = ..., YB = ..., oder YC = ... erfolgt. Hierbei sind dann die entsprechenden Unterordner auszuwählen, die entsprechenden txt-files zu lesen, die Performance-Maße für die jeweiligen Perioden zu ermitteln und die Ergebnisse der jeweiligen Auswertungen sollten dann in die Matrix YA, YB oder YC geschrieben werden.
Dimension von YB (5000 Zeilen, 3 Spalten) und YC (155.000 Zeilen, 3 Spalten).
Der Name des Unterordners in denen das runoff.txt file liegt unterscheidet sich wie folgt:
u_ordner_aNr, u_ordner_bNr, u_ordner_cNr.
Verfasst am: 24.05.2017, 14:08
Titel: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner + d
Hallo meteoGast,
Was ist nun genau Deine Frage?
Zitat:
Der Name des Unterordners in denen das runoff.txt file liegt unterscheidet sich wie folgt:
u_ordner_aNr, u_ordner_bNr, u_ordner_cNr.
Das verstehe ich nicht. Was unterscheidet sie wie?
Gruß, Jan
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 24.05.2017, 15:17
Titel: Re: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordne
Hallo Jan,
Folgende Fragen:
1.) Wie sollte die for-Schleife gestaltet werden damit für die jeweilige Periode (zB. 1. Mai 2013 bis 30. Sept. 2013, 1. Mai 2014 bis 30. Sept. 2014) aus jedem eingelesene txt-file jeweils ein Wert in die Matrix Y geschrieben wird? Also für das erste runoff.txt ein NSE, ein RMSE und ein BIAS, welcher aus den zwei Perioden ermittelt wurde.
Die von mir gestern angegebene for-Schleife liefert leider keine Matrix YA, welche aus 3 Spalten und 5000 Zeilen besteht. Die Berechnung bricht ab nach:
Code:
for k = 1:length(sdate_sdatelim1); a = 1:length(sdate_sdatelim2); b = 1:length(sdate_sdatelim3);
j = find(date_runoff >= sdate_sdatelim1(k) & date_runoff < sdate_sdatelim1(k)+dt) & find(date_runoff >= sdate_sdatelim2(a) & date_runoff < sdate_sdatelim2(a)+dt) & find(date_runoff >= sdate_sdatelim3(b) & date_runoff < sdate_sdatelim3(b)+dt);
Wo könnte da das Problem liegen? Der Speicherpfad passt, aber es funktioniert nicht der Aufruf der einzelnen Unterordner, welche sich durch eine fortlaufende Nummer unterscheiden.
3.) Je nach Variante des Funktionsaufrufes sollten eine unterschiedliche Anzahl/Art von Unterordnern abgearbeitet werden. Der Name der einzelnen Ordner unterscheidet sich wie folgt: u_ordner_a bzw. u_ordner_b, bzw. u_ordner_c und nach dem a, b, c, erweitert mit einer fortlaufenden Nummer. In weiterer Folge sollten die Ergebnisse entweder in die Matrix YA geschrieben werden, wenn die u_ordner_a abgearbeitet werden oder in die Matrix YB oder eben in YC.
Wie kann die Umsetzung erfolgen, um in Abhängigkeit vom Funktionsaufruf die gewünschten Matrizen zu generieren? (Der Unterschied liegt hier nicht in den Rechenoperationen, sondern in der Anzahl der abzuarbeitenden Daten und der Länge der Output-Matrizen).
Viele Grüße
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 29.05.2017, 12:10
Titel: Re: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordne
Hallo,
für das Einlesen von txt-files mit denselben Namen aus verschiedenen Unterordnern, innerhalb von model_standalone, bin ich auf folgende Info gestoßen:
Mdir = dir(pathname);
nbentries = size(Mdir, 1);
Mfiles = [];
for entry_i = 1:nbentries
if Mdir(entry_i).isdir == false
filename = Mdir(entry_i).name;
if filename(1) ~= '.'
[p, n, ext] = fileparts(filename);
ifstrcmpi(ext, '.txt')
Mfiles = strvcat(Mfiles, filename);
end end end end
nbfiles = size(Mfiles, 1);
for iFile = 1:length(Mfiles);
[Date,QSfirn,QSice,QSrock,QSsnow,QSsoil,Qs]=textread(Mfiles(iFile),'%s %f %f %f %f %f %f',-1,'headerlines',1);
end
Das Programm läuft zwar ohne Fehlermeldungen aber es werden die txt-files nicht eingelesen.
Für den Beispielfall, dass im Ordner model_standalone 2 Unterordner mit den Namen results1 bzw. results2 liegen und innerhalb dieser jeweils ein txt-file mit den Namen runoff.txt wird folgendes ausgegeben:
Mdir: 2x1 struct
Mfiles: []
entry_i: 1x1 double mit den Inhalt von 2 (also die Anzahl der Unterordner)
i: 1X1 double mit INhalt 2
nbentries: 1x1 double mit Inhalt 2
nbfiles: 1x1 double mit 0
pathname: char
Das Programm findet hier bereits schon keine txt-files, da ja ansonsten bereits in Mfiles was enthalten sein müsste und ebenso die Variable filename einen Inhalt aufweisen sollte.
Wie kann man dass Problem beheben, dass alle txt-files aus den einzelnen Unterordnern eingelesen werden?
Danke
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 31.05.2017, 10:00
Titel: Re: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordne
Hallo,
hat jemand eine Idee, warum das Einlesen der einzelnen .txt-files aus den verschiedenen Unterordnern nicht funktioniert? (Details siehe post vom 29.5.2017/12:10).
Danke
meteoGast
meteoGast
Gast
Beiträge: ---
Anmeldedatum: ---
Wohnort: ---
Version: ---
Verfasst am: 01.06.2017, 11:25
Titel: Re: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner
Hallo,
das Einlesen der txt-files funktioniert weiterhin noch nicht. Die erste for-Schleife im Beitrag von 29.5.2017, kann auf die txt-files nicht zugreifen. Es werden nur die Unterordner innerhalb von model_standalone gefunen, jedoch nicht die in diesen Unterordnern enthaltenen Dateien.
Evtl. hat jemand eine Idee wo hier der Fehler liegt oder wie man es anderst sinnvoller lösen kann?
Verfasst am: 08.06.2017, 20:07
Titel: Re: Re: Re: Re: Einlesen von txt-Dateien aus mehreren Ordner
Hallo meteoGast,
Der Code liest keine Dateien aus Unterordnern ein, weil er das auch gar nicht versucht. Es ist etwas müsam sich aus diesem langen Thread heraus zu suchen, welches Problem Du hier lösen möchtest. Hast Du eine moderne Matlab-Version? Dann:
Code:
pathname = 'C:\Users\heute\results\model_standalone\';
FileList = dir(fullfile(pathname, '**', 'runoff.txt'));
for iFile = 1:numel(FileList)
aFile = fullfile(FileList(iFile).folder, FileList(iFile).name);
... Import the text file here
end
Wenn Du eine Matlab Version vor 2016b hast, findest Du im FileExchange einige "recursive dir" Lösungen.
Gruß, Jan
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.