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

Ordner einlesen - Datendtruktur

 

djanski
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 09:59     Titel: Ordner einlesen - Datendtruktur
  Antworten mit Zitat      
Hallo noch mal,

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:

xxx_10
xxx_11
.
.
.
xxx_19
xxx_1
xxx_20
xxx_21 usw.

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?


Vielen Dank für die Antworten.
MfG

djanski
Private Nachricht senden Benutzer-Profile anzeigen


eupho
Forum-Meister

Forum-Meister


Beiträge: 777
Anmeldedatum: 07.01.09
Wohnort: Marburg
Version: R2009b
     Beitrag Verfasst am: 06.05.2011, 10:30     Titel:
  Antworten mit Zitat      
Code:
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 10:47     Titel:
  Antworten mit Zitat      
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?
Private Nachricht senden Benutzer-Profile anzeigen
 
JN78
Forum-Fortgeschrittener

Forum-Fortgeschrittener



Beiträge: 69
Anmeldedatum: 18.05.09
Wohnort: Stuhr
Version: R2010b, R2011a
     Beitrag Verfasst am: 06.05.2011, 10:58     Titel:
  Antworten mit Zitat      
Moin,

bin mir nicht sicher, ob ich dein Problem richtig verstanden haben, aber vielleicht hilft dies hier weiter:

Code:

file = dir('*_.txt');
tmp = length(file);

for i=1:tmp
...
file(i).name
...
end


Gruß Jan
_________________

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)
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 10:59     Titel:
  Antworten mit Zitat      
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

Code:

d(laufvariable).name
 

Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 11:33     Titel:
  Antworten mit Zitat      
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:

Code:

clear all

n = 1:25;
Pfad = pwd;

for i = 1: length(n)
    save(fullfile(Pfad, [ 'Bsp' num2str(i) '.txt']), 'n', '-ascii')
end


A = dir;

for i = 3:length(A)
   
    eval(['x' num2str(i-2) ' = A(' num2str(i) ').name']);
end
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.05.2011, 11:48     Titel:
  Antworten mit Zitat      
wie mir grad noch mal aufgefallen ist ergibt sich noch mal eine andere Sowrtierung wenn die Dateinamen so generiert werden:

Code:

save(fullfile(Pfad, [ 'Bsp_' num2str(i) '_.txt']), 'n', '-ascii')
 


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.
Private Nachricht senden Benutzer-Profile anzeigen
 
djanski
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 52
Anmeldedatum: 03.05.11
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 09.05.2011, 14:27     Titel:
  Antworten mit Zitat      
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.

Code:

clear all

A = dir;
g = length(dir);

% 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

 


Bis dahin

MfG

djanski
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.