ich hoffe, dass ich mit diesem Thread hier richtig bin, da es sich nur bedingt um ein Programmierproblem handelt.
Es geht um das automatische Einlesen und Laden von .txt-Dateien.
Die Dateien die ich Einlesen möchte haben alle den Gleichen Dateinamen und unterscheiden sich nur in ihrer Nummerierung. Die Nummerierung wurde dabei automatisch erzeugt und lies sich auch nicht ändern. Sie wurden nach folgeendem Muster beschriftet und liegen auch in der Reihenfolge in dem Ordner vor:
xxx_1
xxx_2
xxx_3
.
.
.
xxx_10
xxx_11 usw.
Beim einlesen und anschließender Auflistung über stringfind ergibt sich jedoch eine DOS-Datenstruktur die so aussieht:
Da ich im Anschluss automatisch Variablen erzeugen möchte die den gleichen Index wie der Dateiname haben soll (Laufvariable der for-schleife soll verwendet werden) ist das recht problematisch wenn die Dateinamen "falsch" sortiert sind.
Meine Frage ist nun, ob Matlab eine Funktion integriert hat, mit der die Ordnerstruktur 1:1 übernommen wird?
hmmm...das ist ja alles schön und gut. Den Befehl verwende ich ja auch. Jedoch benötige ich jetzt Zugriff auf die Dateinamen um sie hinterher in einer Schleife alle automatisch zu Laden.
Hier im Forum gab es eine Lösung mit der Dateinamen/Ordnernamen im jeweiligen Ordner, die nicht eingelesen werden sollen, ausgesiebt werden. Das lief dann über "strcat" und "strfind". Leider finde ich den Eintrag nicht mehr...-.-
man kann doch bestimmt auch direkt auf die Namen zugreifen um sie dann mit "load" und dergleichen zu laden oder?
Ich bin ein Schwamm, denn ich sauge Ideen auf und mache sie nutzbar. Die meisten meiner Ideen gehören ursprünglich anderen Leute, die sich halt nicht mehr die Mühe gemacht haben, sie weiterzuentwickeln. Thomas Alva Edison (1847 - 1931)
EDIT:
Ich habe mir die eingelesenen Namen mit dem Befehl "dir" jetzt noch mal angeschaut und auch dort liegen sie schon in der falschen Reihenfolge vor.
Hat jemand ne andere Idee?
PS: der Zugriff auf den jeweiligen Namen gestaltet sich jedoch recht einfach mit
Vielleicht ist es einfacher mein Problem anhand eines kleinen Beispiels zu erläutern. Zu diesem Zweck geht in Matlab in einen leeren Ordner und lass diesen Programmcode laufen:
Der erste Teil des Codes erzeugt 25 Beispieldateien im Format .txt und dem Inhalt von n, also jeweils die Zahlen 1 bis 25. Diese erscheinen sogleich auch im Ordner.
Der zweite Teil läd diesen Ordner und weißt die Dateinamen variablen mit unterschiedlichen Indize zu. wenn ihr euch jetzt die Ausgabe anschaut werdet ihr feststellen, dass zwar x1 = Bsp1.txt ist, aber x2 = Bsp10.txt.
Genau das möchte ich verhindern. x2 sollte an dieser Stelle dann Bsp2.txt sein.
Die Zahl also nicht am Ende des Dateinamens steht sondern irgendwo in der Mitte. In dem Fall ergibt sich dann eine Sortierung wie ich sie in meinem ersten Post beschrieben habe.
Da sich bisher noch niemand wieder zu der Frage gemeldet hat und ich auch nicht glaube, dass Matlab eine entsprechende Funktion bietet habe ich jetzt eine Sortierschleife geschrieben. Vielleicht hilft sie ja irgendwann jemandem mal.
% Erzeuge String mit file-Namen % ***********************************************************
meinfile = strcat(A(3).name);
for h = 4 : g
meinfile = [meinfile,strcat(A(h).name)];
end
%Man könnte die Schleife auch von 3:g laufen lassen. Wichtig ist jedoch das "meinfile" vorher definiert wird.
% Suche nach Stellen, wo die Buchstaben 'vc' vorkommt und reinschreiben in % Variable "strf" als String % Ist interessant, wenn der Ordner auch Dateien ernthält die nicht mit eingelesen werden sollen % ***********************************************************
strf = strfind(meinfile,'vc');
for i =1:length(strf)
f=1;
if i<length(strf) for h = strf(i):(strf(i+1)-1) %Grenze = wert der nächsten Position in strf
b(i,f) = meinfile(h); %reinscheiben der einzelnen zeichen
f=f+1;
end else for h = strf(i):length(meinfile)% siehe Notiz
b(i,f) = meinfile(h);
f=f+1;
end end end
% Notiz: % dieser Umweg ist nötig, da auf strf(i+1) nicht zugegriffen werden kann (weil es nicht existiert) sobald strf(i) =length(meinfile) ist und sonst der letzte Eintrag nicht mit geschrieben wird.
% Achtung: % sollten in dem eingelesenen Orner noch Dateien/Ordner nach der letzten noch einzulesenden Datei stehen muss hier eine andere Lösung gefunden werden. Der letzte Dateiname enthält sonst alle Dateinamen aneinander gereiht.
% Sortierschleife für DOS-Datenstruktur % ***********************************************************
l = length(b);
y = 10;
z = 1;
z1 = 1; % Hilfsvariable
m = 10; % Hilfsvariable
k = floor(l/10);
p = 10-k; % Anzahl der Dateinamen die hinten stehen aber eigentlich zu den ersten 10 gehören % sollte length(b) z.B. 53 sein so stehen die Dateinamen mit den Endungen % 5:9 am ende. mit k und p wird dies berücksichtigt.
C = 11:11:k*11;
for i = 1:l
if i == l-p+1 for r = 1:p
b1(z,:) = b(l-p+r,:);
z = z+1;
end if z == 10 break end end for n = 1:length(C) if i == C(n)
b1(z,:) = b(i,:);
z = z+1;
else
b1(y,:) = b(i,:);
y = y+1;
b1;
end end if z1 < z
z1 = z1+1;
y = m;
end if m < y
m = m+1;
y = m;
end end
% Abschneiden der doppelt reingeschriebenen Datennamen for i = 1:l
b2(i,:) = b1(i,:);
end
% Anmerkung % Diese Schleife gilt für die in meinem ersten Post gezeigt Struktur und auch nur für Datensätze kleiner 100. Sollte eine Struktur vorliegen, wie sie in dem von mir geposteten Beispiel zur Erzeugung von Dateien vorliegen, liegen die Dateinamen mit den Zahlen kleiner 10 nicht immer an der jeweils 11ten Position sondern beginnen bei bei 1 und von da an jede 11te. Sprich Position 1,12,23,usw. Hierfür müsste die Schleife noch angepasst werden
% Rohdaten auslesen und Variablen mit aufsteigendem Index zuweisen % *********************************************************** for i = 1:l
eval(['x',num2str(i),' = dlmread(b2(i,:));']);
end
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.