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

Dateien einlesen die mit 0 beginnen

 

Xerilefo
Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 28.07.2009, 23:45     Titel: Dateien einlesen die mit 0 beginnen
  Antworten mit Zitat      
Hallo liebes Forum.

Sitze gerade an einem kleinen Projekt welches auch zu 95% schon fertig ist.

Scheitere gerade an der Optimierung einer längeren Berechnung.

Zur Zeit lese ich alle Dateien aus einem Unterordner ein damit ich bestimmte Dateien später weiterverarbeiten kann.

mit

Code:

patch = 'mein Pfad';
    liste = dir(patch);
    files = {liste.name}';
 


Da das erstellen dieser Liste bei 100.000 Dateien etwas lange dauert, aber ich schlussendlich nur 1/10 davon brauche suche ich dafür eine andere Lösung.

Das Problem im konkreten besteht darin, dass die Dateinamen mit Vorgestellten 0(Null) beginnen zB 000111.jpg.

zZ speichere in eine weiteren Schleife dann aus diese gewonnenen Daten zu den gesuchte Datensätzen die dazugehörigen Dateinamen dh. ich habe eine Datei in der die gesuchten Dateien drinnen stehen.

1 -> 3
2 -> 45
3 -> 111

In dieser Datei füge ich danach in der 3. Zelle den Dateinamen an.

1 -> 3 -> 000003.jpg
2 -> 45 -> 000045.jpg
3 -> 111 -> 000111.jpg

Da die darauffolgenden Berechnungen mit den ausgewählten Bildern noch dementsprechend zeit intensiv ist wollte ich gerne den Zwischenschritt über den oben angefügten Code vermeiden.

Hat dazu vielleicht einer eine Idee wie ich das ganze optimieren könnte?

Danke

ps: hoffe ich hab das jetzt nicht zu umständlich erklärt
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.07.2009, 08:49     Titel:
  Antworten mit Zitat      
Hallo,

das war wirklich etwas umständlich. Wenn es darum geht, die Dateien zu bekommen, die mit 0 anfangen:

Code:
mypath = 'mein Pfad';
    liste = dir(fullfile(mypath, '0*.*');
    files = {liste.name}';


(patch sollte als Variablenname vermieden werden, da es auch ein MATLAB-Befehl ist)

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 29.07.2009, 17:10     Titel:
  Antworten mit Zitat      
naja in diesen speziellen fall beginne alle mit 0 und das ohne ausnahmen.

dachte nur es gäbe eine möglichkeit mein code-schnipsel zu umgehen.

das problem in einzelnen besteht ja somit nur hier da die dateinamen aus zahlen und dann noch mit 0 beginnend bestehen. wären die dateinemen aus buchstaben dann würde man die ja ganz einfach mittels

Code:
liste = dir(fullfile(mypath, 'variabel_dateiname.variable_dateiendung');


finden.

Code:
liste = dir(fullfile(mypath, '*variabel_dateiname.variable_dateiendung');


kann ich ja auch nicht verwenden, da ich dann ja bei zB
variabel_dateiname = 57
dann auch alle anderen dateien erhalte in denen 57 vorkommt.

also auch 00057.jpg, 00157.jpg00257.jpg sowie auch dateien wie 01572.jpg usw.


ps: hatte anfangs eh pfad anstelle von patch (sogar noch falsch geschrieben) Smile
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.449
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 29.07.2009, 17:41     Titel:
  Antworten mit Zitat      
Ich habe offen gesagt noch nicht begriffen, welche Dateien du willst bzw. nach welchem Kriterium sie ausgewählt werden. Sprich: wie ist ads von dir erwähnte 1/10 charakterisiert?

Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 29.07.2009, 18:02     Titel:
  Antworten mit Zitat      
Hallo,

ich habe folgende Idee, falls deine Dateinamen gleich lang sind?
Dann kannst den Namen so genieren:
Code:

dateiname1=sprintf('%06d.jpg',57)
dateiname2=sprintf('%06d.jpg',111)
 


und so gleich mehrere
Code:

A               = [3, 45, 57, 111];
dateiname = sprintf('%06d.jpg\n',A);
dateiname = regexp(strtrim(dateiname),'\n','split')
 
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 10:03     Titel:
  Antworten mit Zitat      
Hallo

Ich habe für das Projekt einen Ordner mit Bildern. Dazu habe ich eine Datei in der relevante Bilder dieses Ordners aufgelistet sind.

Dabei habe ich das Problem, dass die Bilder mit 0 beginnen und alle x Zeichen lang sind.

leider habe ich in der Liste mit den Relevanten Bildern nur Zahlen drinen die keine vorstehenden 0en haben.

Deswegen habe ich für diesen Fall den Umweg über die Liste aus allen im Ordner enthaltenen Dateien gewählt (bei mir haben die Dateien eine Dateibezeichnung von 00000 - max. 99999).

So wie ich es zZ habe haut es mich ja schon auf die Nase wenn nur ein Bild im Ordner fehlen würde. Gehe nämlich davon aus, dass ausnahmslos alle Bilder vorhanden sind und ich so über die Zeilen der Hilfsliste auf die Dateinamen kommen.
Im konkreten hieße das, dass ich in meiner Liste der relevanten Dateien in Zeile 1 die Zahl 3, in Zeile 2 die Zahl 45 und in Zeile 3 die Zahl 111 befindet. Danach gehe ich her und sage, füge in der Zeile 1 den Dateinamen aus Zeile 3 der Hilfliste ein usw.
Da dies aber nur auf diesen eine speziellen Fall anwendbar ist und auch nur aus dem Grund da ich eine Liste habe wo nahtlos alle Bilder drinnen sind.

Leider ist dies ja nicht universell einsetzbar.

Und genau da stehe ich nun an.

Ziel sollte es sein, dass ich eine Liste bekomme mit Daten (denke mal, dass es voraussichtlich immer Zahlen sind die verwendet werden da man ja damit leichte rechnen kann), einen Ordner mit Bildern und ich dann aus diesen 2 Inputs meine Berechnungen mit den Bildern durchführe (Berechnung mit den Bildern klappt schon).

@Harald

Was die 1/10 beziehung betrifft geht es darum:
Wenn ich angenommen 10000 Bilder habe, eine Liste mit relevanten Bildern dann kann ich davon ausgehen, dass ich laut dieser Liste nur 1/10 der Bilder brauche dh. das einlesen der anderen Bilder wär somit sinnlos und nur Zeit raubend.

Code:

dateiname = sprintf('%06d.jpg\n',A);


Gehe ich richtig in der Annahme, dass mit %06d eine Länge von 6 Ziffern mit beginnender 0 gemeint ist?
Wird hier davon ausgegangen, dass es immer eine 0 am Anfang gibt?
Private Nachricht senden Benutzer-Profile anzeigen
 
denny
Supporter

Supporter



Beiträge: 3.853
Anmeldedatum: 14.02.08
Wohnort: Ulm
Version: R2012b
     Beitrag Verfasst am: 30.07.2009, 11:38     Titel:
  Antworten mit Zitat      
Hallo
Xerilefo hat Folgendes geschrieben:

Code:

dateiname = sprintf('%06d.jpg\n',A);


Gehe ich richtig in der Annahme, dass mit %06d eine Länge von 6 Ziffern mit beginnender 0 gemeint ist?
Wird hier davon ausgegangen, dass es immer eine 0 am Anfang gibt?


Ja , alle Zahlen die weniger als 6 Zeichen haben, werden künstlich mit Nullen aufgefüllt.

So habe nochmal mehrmals deine letztes Posting durchgelesen und denke dass mein Vorschlag passt.

Du hast doch
1) Daten-Liste als Zahlenvektor
2) Dateinamen sind x lang


Code:


A           = [3, 45, 57, 111];
dateinamen = sprintf('%06d.jpg\n',A);
dateinamen = regexp(strtrim(dateinamen),'\n','split')

%
liste = dir(fullfile(mypath, '*.jpg'));
liste={liste.name};
dateinamen =intersect(liste,dateinamen );
 


Zuletzt bearbeitet von denny am 30.07.2009, 12:04, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 30.07.2009, 11:59     Titel:
  Antworten mit Zitat      
denny hat Folgendes geschrieben:
Ja , alle Zahlen die weniger als 6 Zeichen lang sind, werden künstlich mit Nullen aufgefüllt und zwar am Anfang.


Glaub das könnte schon mal ein guter Fortschritt sein.

Werde es am Abend gleich mal ausprobieren ob es so funktioniert.
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 03.08.2009, 23:28     Titel:
  Antworten mit Zitat      
leider bin ich erst heute dazugekommen den Vorschlag zu testen.

Muss sagen, dass es so wunderbar klappt.

Danke nochmal für die Hilfe.


aber noch schnell was anderes:

gibt es eigentlich eine deutschsprachige Dokumentation?
Private Nachricht senden Benutzer-Profile anzeigen
 
Andreas Goser
Forum-Meister

Forum-Meister


Beiträge: 3.654
Anmeldedatum: 04.12.08
Wohnort: Ismaning
Version: 1.0
     Beitrag Verfasst am: 04.08.2009, 08:57     Titel:
  Antworten mit Zitat      
Es gibt keine deutschsprachige Dokumentation, aber zig deutschsprachige MATLAB Bücher wie sie ja auch hier beworben werden. Eine Übersicht auf MathWorks Seiten gibt es auch.

Andreas
Private Nachricht senden Benutzer-Profile anzeigen E-Mail senden
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 04.08.2009, 19:41     Titel:
  Antworten mit Zitat      
Danke nochmal an die hilfreichen Beiträge.

Danke für die Info zwecks Doku.

Damit kann ich das Thema dann für erledigt erklären.
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 23.08.2009, 17:59     Titel:
  Antworten mit Zitat      
Jetzt hat sich ein weiteres Problem herausgestellt

Da ich nun über die dir-Funktion die Dateinamen und so deren Länge ermittle sowie deren Dateiendung deswegen müsste ich nun den spdrintf-Ausdruck umschreiben.

Code:

A=1;
dateiname = sprintf('%06d.jpg\n',A);


ergibt ja 000001.jpg

da ich aber die 6 durch eine Variable ersetzten möchte funktioniert das ganze nimmer.

Geht das überhaupt?

mein derzeitiger Code:


Code:

Path='C:\...\';
x = dir(Path);
y = x(5).name;
[pathstr, name, ext, versn] = fileparts(y);

z=size(name);
ab=5; %wird eigentlich berechnet
dateinamen = sprintf('%06(die 6 sollte mit der Variable z(2) ersetzt werden)d%s',z(2),ab,ext);
 


leider kann ich da mit %d keine weitere Variable einfügen, da er %0%dd ja nicht erkennt Smile

gibt es dazu einen Lösungsvorschlag?
Private Nachricht senden Benutzer-Profile anzeigen
 
LittleX
Forum-Guru

Forum-Guru


Beiträge: 494
Anmeldedatum: 14.05.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 24.08.2009, 09:54     Titel:
  Antworten mit Zitat      
Hallo,

Du kannst Dir den Formatstring erst einmal selber zusammenbauen.
Code:

str = ['%0',num2str(z(2)),'d',ext];
dateiname = sprintf(str,ab)
 


Viele Grüße,

LittleX
Private Nachricht senden Benutzer-Profile anzeigen
 
Xerilefo
Themenstarter

Forum-Newbie

Forum-Newbie


Beiträge: 8
Anmeldedatum: 28.07.09
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 25.08.2009, 00:19     Titel:
  Antworten mit Zitat      
die lösung vor augen aber den weg nicht gefunden ... danke für die hilfe
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 - 2024 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.