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

Eine Waitbar auf Datenimport beziehen

 

remix92
Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 02.02.2018, 16:23     Titel: Eine Waitbar auf Datenimport beziehen
  Antworten mit Zitat      
Hallo zusammen,

Ich habe einen Code, welches ein Excel File als Table in matlab importiert.
Da die Datenmenge sehr groß ist, dauert dies ca 20 min...
Code:

test_data= readtable('Test_data.xlsx');
 

Der Restliche Code (Bearbeiten des Tables, Berechnungen usw) dauert ca 1 min.

Ist es denn möglich eine Waitbar zu implementieren, der den Aktuellen Status des Imports anzeigt? Damit mein ich. Die Improtierung soll bis 90% gehen und die Berechnung nach der Importierung sollen 10% betragen?

Ich habe bisher leider Codes für waitbar gefunden, die auf eine For Schleife bezogen waren...

Wäre für jede Hilfe Dankbar:)
Private Nachricht senden Benutzer-Profile anzeigen


Harald
Forum-Meister

Forum-Meister


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

während der Abarbeitung eines Befehls ist eine Aktualisierung nicht möglich.

Das bestmögliche wäre m.E.:
Code:
h = waitbar(0,'Importing Data...');
test_data= readtable('Test_data.xlsx');
waitbar(0.9, h, 'Processing Data')
% Verarbeiten
close(h)


Weitere Möglichkeiten:
- die Tabelle stückweise in einer for-Schleife laden. Dann kann man den waitbar aktualisieren
- falls es immer die gleiche Tabelle ist, den Table einmalig einlesen und dann als .mat-File speichenr.
- ein anderes Datenformat, z.B. Textdatei, in Erwägung ziehen

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.02.2018, 16:20     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Antwort!

Leider ist es nicht immer selbe Datei, die importiert werden muss...
Wie kann ich die Datenimportierung Spaltenweiße vornehmen, so dass ich eine For Schleife miteinbauen und diese an die waitbar verknüpfen kann ?
Komm leider nicht auf die Syntax... Hab diese immer über den eigentlichen Befehl
readtable vorgenommen.

Eine 2te Frage die sich ebenso stellt, dauert dann die Importierung länger?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 05.02.2018, 16:31     Titel:
  Antworten mit Zitat      
Hallo,

wie viele Spalten sind es denn?
Bei bis zu 26 kann man char(64+k) verwenden, um den k-ten Buchstaben des Alphabets zu erzeugen. Bei mehr Spalten ist es schwieriger.

Eine Alternative kann sein, datastore zu verwenden und 'SelectedVariableNames' entsprechend anzupassen.

Zitat:
Eine 2te Frage die sich ebenso stellt, dauert dann die Importierung länger?

Da kann ich auch nur spekulieren. Am einfachsten wird es sein, das mal für eine oder auch ein paar Dateien auszutesten.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 06.02.2018, 12:39     Titel:
  Antworten mit Zitat      
Danke für die Antwort!
Es sind meist ca 100-300 Spalten.

Ich importiere mit dem Befehl
Code:

A=readtable('Test_data.xlsx')
 


und habe im nachhinein für die Bearbeitung eine For schleife erzeugt mit
Code:

um Spaltenweiße im nachhinein zu arbeiten


kann man die Forschleife nicht irgendwie an die Importierung anpsassen?
zum Beispiel (Die Syntax ist leider hier falsch, da es nur ein Gedankengang ist)
Code:

for k=1:size('Test_data.xlsx',2)
A(:,k) = readtable['Test_data.xlsx'(:,k)]
end
 


Eine Ausweichmöglichkeit wäre:
Zuerst alles zu importieren und dann im Nachachinein nochmal Spaltenweiße in eine Wietere Variable zu kopieren

Code:

A=readtable('Test_data.xlsx');
for k=1:size(A',2)
B(:,k) = A(:,k);
end
 

Aber wäre halt doppelte Arbeit, was auch wahrscheinlich doppelt an Zeit kosten würde....
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 06.02.2018, 17:43     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
kann man die Forschleife nicht irgendwie an die Importierung anpsassen?

Sicher kann man das, aber man muss dazu die 'Range' - Option von readtable verwenden und vor allem die Ranges (A:A, B:B, ..., Z:Z, AA:AA, AB:AB, ..., AZ:AZ, BA:BA, BB:BB, ..., BZ:BZ, ...) automatisch erzeugen. Das ist mühsam.
Einfacher ist wie gesagt datastore.

Wieviele Zeilen haben die Dateien in etwa?

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 07.02.2018, 10:21     Titel:
  Antworten mit Zitat      
Die Anzahl an Zeilen kann sehr varrieren.

zwischen 100 - 2.000.000...

Mit datastore habe ich bisher noch nie gearbeitet..
Ich hoffe du kannst mir da weiterhelfen Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 07.02.2018, 19:26     Titel:
  Antworten mit Zitat      
Hallo,

hast du denn mal die Doku genau gelesen? Das ist wirklich kein Hexenwerk...

Code:
ds = datastore('Test_data.xlsx');
names = ds.VariableNames;
T = table;
for k = 1:length(names)
    ds.SelectedVariableNames = names{k};
    T.(names{k}) = table2array(readall(ds));
    reset(ds);
end


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2018, 12:38     Titel:
  Antworten mit Zitat      
Hi,

Vielen Dank. Klappt wunderbar.
habe es auch nun mit einer waitbar verknüpft.

Code:

 h = waitbar(0,'Importing Data. Please Wait....');
 ds = datastore('Test_data.xlsx')
 names = ds.VariableNames;
 T = table;
 for k = 1:length(names)
     ds.SelectedVariableNames = names{k};
      T.(names{k}) = table2array(readall(ds));
     reset(ds);
     waitbar((k)/length(names)-0.1);
 end
close(h)
 


[Habe erstmal einen testlauf mit 10.000 Zeilen und 200 Spalten gemacht!]
Nur dauert es gefühlt eine Ewigkeit, bis die Daten improtiert werden....
mit readtable dauert es ca 2 min
mit datastore, habe ich noch 10 min abgebrochen....

Gibt es eventuell eine Lösung dafür?

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2018, 12:45     Titel:
  Antworten mit Zitat      
Hallo,

dank des Fortschrittsbalkens solltest du ja aber zumindest wissen, wie lange es wohl insgesamt gedauert hätte?
Es ist durchaus zu erwarten, dass es länger dauert, die Spalten einzeln zu importieren als am Stück. Intuitiv würde ich erwarten, dass es zeilenweise besser klappt.

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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2018, 13:22     Titel:
  Antworten mit Zitat      
Nach 10 min, ist an der Waitbar kein Fortschritt zu erkennen...
Deswegen habe ich abgebrochen...

Wie ist es denn möglich Zeilenweiße zu importieren ?...
Tut mir leid für die Fragen, die für Sie wahrscheinlich selbsterklärend sind Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
remix92
Themenstarter

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2018, 14:33     Titel:
  Antworten mit Zitat      
Eventuell eine andere Frage, welches die Importierung verkürzen könnte..
Leider weiß ich nicht wie ich das hinbekomme..

Nach der Importierung, nehme ich eine Formatierung vor, welches bestimmte Spalten löscht.
Das wären folgende Bedingung:
1. Spalten die nur NaN werte enthalten.
2. Spalten die nur cell Datentypen besitzen.
3. Spalten dir nur 0 Werte enthalten.
4. Spalten die Datum/Zeit Einträge besitzen.

Das mache ich wie folgt:

Code:

Table(:, all(ismissing(Table, {0, NaN}), 1)) = [];
datatypes = table2cell(varfun(@class, Table));
toremove = strcmp(datatypes, 'cell');
toremove1 = strcmp(datatypes, 'datetime');
Table(:, toremove) = [];
Table(:, toremove1) = [];
 


Ist es denn möglich vor der Importierung diese Bedingungen zu berücksichtigen?
Dadurch reduziert sich die Spaltenanzahl sehr stark.
von ca 200 Spalten auf 60 Spalten!

Und es werden schlussendlich nur ca 60 Spalten importiert, was die Wartezeit sehr stark beeinflussen müsste Smile

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2018, 17:09     Titel:
  Antworten mit Zitat      
Hallo,

Zitat:
Nach 10 min, ist an der Waitbar kein Fortschritt zu erkennen...
Deswegen habe ich abgebrochen...

Überhaupt kein Fortschritt? Dass es länger dauert, eine Spalte zu importieren als 200 Spalten zu importieren, fände ich sehr ungewöhnlich.

Zitat:
Wie ist es denn möglich Zeilenweiße zu importieren ?...

Bei readtable müsste man den zu importierenden Bereich explizit angeben. Bei datastore kann man statt readall den read-Befehl in einer while-Schleife verwenden.
Damit wir wissen, ob letzteres einen Versuch wert ist, versuch mal
Code:
ds = datastore('Test_data.xlsx');
T = table2array(readall(ds));


Grüße,
Harald
Private Nachricht senden Benutzer-Profile anzeigen
 
Harald
Forum-Meister

Forum-Meister


Beiträge: 24.432
Anmeldedatum: 26.03.09
Wohnort: Nähe München
Version: ab 2017b
     Beitrag Verfasst am: 12.02.2018, 17:30     Titel:
  Antworten mit Zitat      
Hallo,

was die weitere Frage angeht: den Spalteninhalt kann man vorab nicht filtern, den Spaltendatentyp kannst du aber bei datastores vorab abfragen:

Code:
ds.SelectedVariableTypes


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

Forum-Fortgeschrittener

Forum-Fortgeschrittener


Beiträge: 61
Anmeldedatum: 11.07.17
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 12.02.2018, 18:04     Titel:
  Antworten mit Zitat      
Hallo,

Wenn ich nur den Code ausführe:
Code:

ds = datastore('Test_data_neu.xlsx');
T = table2array(readall(ds));
 


Gibt er mir die Fehlermeldung, dass einige Spalten nicht nicht zusammenknüpfen werden können, da diese Spalten "Cell" oder "Double" Datentyp beistzen...

Gruß
Private Nachricht senden Benutzer-Profile anzeigen
 
Neues Thema eröffnen Neue Antwort erstellen

Gehe zu Seite 1, 2  Weiter

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.