ich habe mir gerade einen kleines Script geschrieben, welches mir aus knapp 6000 einzelnen Txt Dateien zunächst den inhalt per Textscan lädt. Aus diesem inhalt werden dann bestimmte Zeilen extrahiert und anschließend mit den entprechenden headern in eine Excel-Tabelle geschrieben.
Nun rödelt mein rechner damit schon knapp 30 min umher. Da dachte ich mir, frage ich in der Zwischenzeit doch mal, ob ich den Code in bezug auf Effizienz und Geschwindigkeit iwie verbessern kann?
Das script sieht wie folgt aus:
Code:
pfad = 'C:\Users\Dexter\Desktop\Diplomarbeit\Diplomarbeit_Daten\Daten\NOWCAST';
liste = dir(fullfile(pfad,'*.txt'));
files = {liste.name};
for k = 1:numel(files)
fid = fopen(fullfile(pfad, files{k}));
format = '%s%s%s%s%s%s%s%s';
daten{k} = textscan(fid,format,'Headerlines',1,'EmptyValue',NaN,'EndOfLine','\r\n','MultipleDelimsAsOne',1,'Delimiter',',''\t');
fclose(fid);
end
mit dem Profiler kannst du selbst herausfinden, welche Teile deines Codes die meiste Zeit brauchen. Natürlich kann man das auch mit wenigen Dateien machen, um erste Schätzungen zu bekommen.
Auf Anhieb würde ich vermuten, dass es das Schreiben nach Excel ist. Dein Code dürfte in der jetzigen FormStunden, wenn nicht Tage laufen.
Ich würde nach Möglichkeit mehrere xlswrite-Befehle vermeiden, da die Datei dabei jedes Mal von neuem geöffnet wird.
Wie du richtig vermutet hast, läuft es tatsächlich seit stunden. Ich werde mal sehen, ob sich deine Tipps umsetzen lassen. Es kommt auf jeden Fall alles in eine Excel Datei. Könnte ich meine ganzen Block einem xlswrite umsetzen?
Würde das schreiben in eine txt Datei schneller gehen, falls sich bei xlswrite nichts verbessern lässt?
Melde mich morgen mit möglichen Verbesserungen nochmal. Danke soweit erstmal
Heute morgen, nach 16h musste ich das Skript leider abbrechen. Zu deisem Zeitpunkt waren immerhin knapp 85% verarbeitet.
Nun habe ich die Funktion aus dem ersten Link ausprobiert. Diese ist mit 10 minuten knapp 100 mal schneller. Leider hat sie aber komplett falsche Ergebnisse geliefert. Den Grund dafür konnte ich auch nach 2 Stunden herumprobieren nicht finden.
Es wird keine Fehlermeldung generiert, lediglich die Excel-Tabelle enthält falsche Werte. Die Header stimmen alle, jedoch wird z.B. eine Zeile mit in die Tabelle geschrieben, die ich gar nicht in den Workspace lade. Alle anderen Zeilen enhalten zwar reale Werte aus den 6k Dokumenten. Allersdings auch alles aus Zeilen, die ich nie verwendet habe.
Die Funktion aus dem zweiten Link rattert jetzt seit etwa 2 Stunden vor sich hin. Diese hätte ich erstmal mit weniger Dateien testen sollen, jetzt will ich aber auch nicht mehr abbrechen, in der Hoffnung das bald das Ende erreicht ist.
Warum bei der ersten Funktion falsche Ergebnisse herauskommen, kann ich nicht beantworten. Das müsstest du selbst mit dem Debugger überprüfen oder auch den Autor der Funktion kontaktieren - am besten mit einem reproduzierbaren Beispiel.
Da du immer in Blatt 1 derselben Datei schreibst (wenn ich das richtig sehe), sollte es aber möglich sein, die gesamten Daten in MATLAB richtig zu organisieren (z.B. als großes Cell Array; dabei müssen numerische Daten mit num2cell umgewandelt werden) und alles mit einem xlswrite-Befehl zu schreiben.
Okay, fehler gefunden. Die letzten ~650 Dateien haben aus irgend einem grund immer eine Zeile mehr. Hatte halt nicht alle 6000+ dateien genau angeschaut...
Auslesen und schreiben in Excel Datei dauert jetzt nur noch etwa 7 min insgesamt.
danke für die Links und die Hilfe!
Einstellungen und Berechtigungen
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.