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

alle xls Dateien in andere pfad lesen

 

samad
Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 17.06.2013, 16:39     Titel: alle xls Dateien in andere pfad lesen
  Antworten mit Zitat      
Hi.
Ich habe z.B n xls Dateien in andere Pfad('D:\MatlabTestData\-10C\Batt\')
Ich möchte, dass matlab in diesem Pfad rein geht und alle xls Dateien lesen.
Ich habe ne Code geschrieben.(siehe Unten). Der öffnet den Pfad und lies die Dateien in ein str. Das heist, dass ich die Dateien wieder aus diese str raus extrahieren soll.
Kann jemand mir helfen, um diese n Dateien einfach in Workspace bringen und lesen.

Ich danke euch.


Code:
% go to path
source_dir = 'D:\MatlabTestData\-10C\Batt\';
%all files with xls format
source_files = dir(fullfile(source_dir, '*.xls'));
%read all xls file
for i = 1:length(source_files)
  data{i,length(source_files)} = xlsread(fullfile(source_dir,       source_files(i).name));

  File1=data{1,3};
end


[EDITED, Jan, bitte Code-Umgebung verwenden, Danke!]
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

der Code sieht soweit ganz gut aus. Ich würde allerdings data{i} statt data{i,length(source_files)} verwenden.

data beinhaltet dann die numerischen Daten aller Excel-Dateien. Wo genau liegt nun das Problem?

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2013, 08:56     Titel:
  Antworten mit Zitat      
Danke Harald

Wenn ich nur {i} benutze wird nur einzige excel Datei geöffnet.
Mein Problem ist:
Ich habe z.B mal 3 mal 4 Excel Dateien in ein Ordner. Der Anzahl der Dateien können sich ändern.
Ich möchte, dass Matlab in diese Ordner nach alle xls Dateien sucht und alle diese Dateien liest und in Workspace bringt, um später weiteren Datenoperationen mit diese XLS Spalten statt findet.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.06.2013, 13:29     Titel:
  Antworten mit Zitat      
Hallo samad,

Zitat:
Wenn ich nur {i} benutze wird nur einzige excel Datei geöffnet.

Das kann ich nicht nachvollziehen und es sieht nicht logisch aus. Die Anzahl der geöffneten Dateien wird dadurch gar nicht beeinflusst.

Zitat:
Ich möchte, dass Matlab in diese Ordner nach alle xls Dateien sucht und alle diese Dateien liest und in Workspace bringt, ...

Was bedeutet nun "in den Workspace bringen" genau?

Vielleicht möchtest Du dies:
Code:
for i = 1:length(source_files)
  temp = xlsread(fullfile(source_dir,       source_files(i).name));
  data{i} = temp{3};
end

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
samad
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2013, 15:07     Titel:
  Antworten mit Zitat      
Danke für Antwort Very Happy

Ich erkläre es viel einfacher dies Mal.
In source Ordner habe ich mal 3 oder 4 oder 100 xls Daten mit verschiedenen Namen.
z.B.
Datei1) SpannungBatterie1.xls <995x16 double>
Datei2) SpannungBatterie2.xls <994x16 double>
…………….und so weiter

Meine Aufgabe ist, dass ich z.B. nächste Woche 3 Spannungswerte bekomme. Ich muss dann Spalte 1, 11,12 von jede diese xls Dateien jeweils lesen können und nach Näherungswerte suchen, die mit 3 Spannungswerte besser passen.
D.h. Spalte 1,11,12 von alle xls Dateien lesen.
Ich dachte, dass mit length kann ich bestimmen wie viel Dateien gibt. Und matlab liest alle nach einander.
Also :

Spalte 1,11,12 von alle xls Dateien die in Pfad existieren lesen.
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 18.06.2013, 15:27     Titel:
  Antworten mit Zitat      
Hallo samad,

Jetzt wird es etwas klarer. Was funktioniert nur bei den hier gezeigten Lösungsvorschlägen nicht wie gewünscht?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
samad
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 18.06.2013, 16:20     Titel:
  Antworten mit Zitat      
Das was du mir vorgeschlagen hast, liest nur ein einziege xls Datei und ergibt auch ein Fehler.

Code:
Code:
% ============================================
source_dir = 'D:\MatlabTestData\MariaDaten\-10C\Exide\';

source_files = dir(fullfile(source_dir, '*.xls'));

for i = 1:length(source_files)
  temp = xlsread(fullfile(source_dir,       source_files(i).name));
  data{i} = temp{3};
end
% ==============================================
 


Fehler:
Code:
% ==============================================
Cell contents reference from a non-cell array object.

Error in AllFileReadTest (line 23)
  data{i} = temp{3};
% ==============================================
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 18.06.2013, 18:11     Titel:
  Antworten mit Zitat      
Hallo,

wenn beim ersten Durchlauf ein Fehler auftritt, sollte es nicht verwundern, dass keine weiteren Dateien eingelesen werden.

Anoassung des Codes von Jan:
Code:
source_dir = 'D:\MatlabTestData\MariaDaten\-10C\Exide\';

source_files = dir(fullfile(source_dir, '*.xls'));

for i = 1:length(source_files)
[~,~,data{i}] = xlsread(fullfile(source_dir, source_files(i).name));
end


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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 19.06.2013, 10:24     Titel:
  Antworten mit Zitat      
Hi noch mal.

Diese Code macht irrgendwie nicht was ich möchte.
Damit ihr mir besser helfen können habe ich ein einfachere Code geschrieben der auch einfache Cell arrays dabei hat:

Code:
clear all
clc
a={1,2,12,3,9,3,5;5,5,3,4,2,3,3;5,2,2,9,7,12,7;4,7,3,2,6,3,6;1,2,2,4,1,1,8;1,2,1,4,2,3,4;};
b={1,2,1,4,2,3,4;5,5,3,4,2,3,3;5,2,2,9,7,12,7;4,7,3,2,6,3,6;1,2,2,4,1,1,8;1,2,12,3,9,3,5;};
c={1,2,12,3,9,3,5;1,2,1,4,2,3,4;5,5,3,4,2,3,3;4,7,3,2,6,3,6;1,2,2,4,1,1,8;5,2,2,9,7,12,7;};
Dat={a b c};

i=[0:1:length(Dat)];
counter=1;
counter=counter+i;

for k=counter:length(Dat)
   [spalte{k}]=[Dat{k}(:,2)];

end
 


Ich möchte z.B. hier in a und b und c jeweils die Spalten 2 und 4 auslesen.
Bis jetzt habe ich nur geschaft Spalte 2 von jede Array zu lesen.

Problem1)
Matlab merkt, dass ich 3 Array von Daten habe ("variable K") und der merkt, dass ich Spalte 2 auslesen möchte. Der speichert aber die Spalten in Form von ein Array in ein zweite Array "spalte".

Antwort sieht jetzt so aus:
Spalte=
<6x7 cell> <6x7 cell> <6x7 cell>

mein gewünschte Antwort müss aber so aussehen:

spalte=
5 5 1
5 5 2
3 3 1
4 4 4
2 2 2
3 3 3
3 3 4

Problem2)
Wie kann ich mit einer Schleife das gleiche auch für Spalte 4 machen, so dass Spalte 4 auch neben Spalte 2 ausgelesen und in der selben Array gespeichert wird


Danke
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.501
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 19.06.2013, 18:18     Titel:
  Antworten mit Zitat      
Hallo,

auf die Schnelle würde ich so sagen:


Code:
for k=counter:length(Dat)
   spalte{k}=cell2mat(Dat{k}(:,[2 4]));

end
spalte = cell2mat(spalte);



Wie deine gesamte gewünschte Antwort aussehen soll, wird aus den beiden Teilfragen leider nicht klar.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 09:56     Titel:
  Antworten mit Zitat      
hi.
Danke für eure Betreuung.
War große Hilfe.
Ich habe es probiert und der macht genau das was ich haben will.

ABER Wink

Wenn ich es in mein Code implementiere funktioniert es nicht. Ich vermüte, dass es sich um double und Cell und die Conversion zwischen die beide handelt.
Wenn ich es in mein Code schreibe bekomme ich diese Fehlermeldung:
=======================================================
Error using cat
CAT arguments dimensions are not consistent.

Error in cell2mat (line 76)
m{n} = cat(2,c{n,:});

Error in AllFileReadTest (line 33)
[CompairData] = cell2mat(CompairData);
========================================================

Ich glaube es liegt daran, dass wenn ich xls Dateien lese bekomme ich ein array von double.
Ich habe die xls Dateien auch als Anhang mitgeschickt.

und hier ist mein Code:

Code:
%=======================================================
clear all
clc

source_dir = 'D:\MatlabTestData\Daten\-10C\Batt\';

source_files = dir(fullfile(source_dir, '*.xls'));

i=[0:1:length(source_files)];
counter=1;
counter=counter+i;


for k=counter:length(source_files)
   
    CompairData{k} = xlsread(fullfile(source_dir, source_files(k).name));
    CompDataDouble2Cell{k} = num2cell(CompairData{k});
    spalte{k}=cell2mat(CompDataDouble2Cell{k}(:,[2 4]));
end
CompairData = cell2mat(CompairData);

%=======================================================


[EDITED, Jan, Bite Code-Umgebung benutzen - Danke!]

File3.xls
 Beschreibung:

Download
 Dateiname:  File3.xls
 Dateigröße:  152 KB
 Heruntergeladen:  340 mal
File1.xls
 Beschreibung:

Download
 Dateiname:  File1.xls
 Dateigröße:  152 KB
 Heruntergeladen:  294 mal
File2.xls
 Beschreibung:

Download
 Dateiname:  File2.xls
 Dateigröße:  147 KB
 Heruntergeladen:  293 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.06.2013, 11:25     Titel:
  Antworten mit Zitat      
Hallo samad,

Harald hatte bereits dies vorgeschlagen:
Code:
[~,~,data{i}] = xlsread ...

Dies importiert die Roh-Daten. Hilft das weiter?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
samad
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 12:44     Titel:
  Antworten mit Zitat      
hi.

Nein leider funktioniert es nicht.

Mit
Code:

[~,~, CompairData{k}] = xlsread(fullfile(source_dir, source_files(k).name));


bekomme ich 3 array of cell. Ich brauche aber matrix als Eregebnis. Ich habe versucht mit
Code:

for k=counter:length(source_files)
[~,~, CompairData{k}] = xlsread(fullfile(source_dir,source_files(k).name));
spalte{k}=cell2mat(CompairData{k}(:,[2 4]));
end
CompairData = cell2mat(CompairData);
 


ein Matriz am Ende bekome. Leider bekomme ich ne Fehlermeldung:

Error using cell2mat (line 46)
All contents of the input cell array must be of the same data type.

Error in AllFileReadTest (line 31)
spalte{k}=cell2mat(CompairData{k}(:,[2 4]));
Private Nachricht senden Benutzer-Profile anzeigen
 
Jan S
Moderator

Moderator


Beiträge: 11.057
Anmeldedatum: 08.07.10
Wohnort: Heidelberg
Version: 2009a, 2016b
     Beitrag Verfasst am: 20.06.2013, 14:05     Titel:
  Antworten mit Zitat      
Hallo samad,

Ich glaube, hier können wir nicht weiter raten. Aber Du könntest einfach heraus finden, wieso es zu dieser Meldung kommt:
Zitat:
All contents of the input cell array must be of the same data type.

Das heißt ja, dass nicht alle Elemente den selben Typ haben. Aber welche Typen findest Du denn in CompairData{k}(:,[2 4])) ?

Gruß, Jan
Private Nachricht senden Benutzer-Profile anzeigen
 
samad
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 28
Anmeldedatum: 01.03.10
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 20.06.2013, 17:08     Titel:
  Antworten mit Zitat      
Ich habe oben text und dann nur Zahlen.
Ich habe beim vorletzte Code die Daten als Anhang mitgeschickt.
Ich glaube ich müss erst ab Zeile 5 die Daten lesen.

Code:

CompairData{k} = num2cell(CompairData{k}(:,[6 11]));
 


sagt , dass ich ab erste Zeile nur Spalte 6 und 11 z.B auslesen kann.
wenn ich ab Zeile 5 die beide Spalten auslesen möchte, dachte ich, dass ich den Code so ändern müss

Code:

CompairData{k} = num2cell(CompairData{k}([5 :],[6 11]));
 


aber der funktioniert nicht.

Die Dateien sind als Anhang oben zu finden
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.