Verfasst am: 02.09.2021, 09:12
Titel: Wertänderung in Tabellen detektieren und neu abspeichern
Hallo Zusammen,
ich stehe in Matlab noch sehr am Anfang und habe folgendes Problem:
Ich habe eine Sammlung an .txt-Dateien in einem Ordner, die immer dieselben Spalten, aber unterschiedliche Zeilenanzahlen haben. Die Daten bilden Zeitstempel, Messwerte, ... ab und enthalten in der 45. Zeile eine Information zum Zyklus , in dem die Messwerte erfasst wurden.
In der 45. Spalte der Tabellen möchte ich detektieren, wenn eine Wertänderung auftritt (bspw. 0 --> 1, nur Ganzzahlen). Tritt eine derartige Wertänderung auf, so soll eine neue Tabelle abgespeichert und ab diesem Punkt die nächste Wertänderung gesucht werden (1 --> 2 usw.), sodass ich am Ende aus all den Dateien jeweils Tabellen erhalte, die in der 45. Zeile jeweils nur dieselbe Zahl, also 0, 1, 2, ... stehen haben. Die Wertänderungen sind fortlaufend.
Die Schwierigkeit sehe ich darin, dass diese Wertänderungen in einer beliebigen Zeile einer Tabelle auftreten und ich teilweise mehrere Tabellen verknüpfen muss, um so jeweils eine Tabelle für jeden Wert zu generieren.
Ist dies überhaupt möglich und wenn ja, wie kann ich mir das vorstellen?
Ich habe bereits überlegt, ob ich die Tabellen erst zu einer großen Tabelle zusammenfüge und in dieser die Wertänderungen detektiere, allerdings bin ich mir nicht sicher, ob Matlab mit Tabellen der Größenordnung >50 GB etwas anfangen kann.
Die Datei im Anhang enthält den Wechsel 1 --> 2 (in Zeile 52065/52066)
Vorab schonmal vielen Dank für jede Hilfe.
Brauchbaren Code habe ich leider noch keinen. Allerdings die Schlagworte: readtable, find(diff), writetable, splitapply
data = readtable("Cell_log_Group_6_2019_09_03_12_08_11.txt");
change = find(diff(data.CellGroupChargeCycle_cnt_)>0);
start = [1; change+1];
ende = [change; height(data)];
group = data.CellGroupChargeCycle_cnt_(start);
for k = 1:length(start) writetable(data(start(k):ende(k),:), "Cell_log_"+group(k)+".txt") end
Für mehrere Dateien würde ich datastore verwenden und die Blöcke nacheinander abarbeiten. Wichtig ist dann, bei writetable die Option "WriteMode", "append" zu verwenden.
Da immer nur eine Datei gleichzeitig geladen wird, sehe ich in der Datenmenge kein Problem. Natürlich musst du etwas Geduld mitbringen: für eine Datei dauert das bei mir ca. 6 Sekunden. Wenn du ca. 1000 solcher Dateien hast, sind wir bei 6000 Sekunden bzw. fast 2 Stunden.
Wie groß ist denn der Hauptspeicher? Vermutlich nicht so groß, dass es realistisch ist, den kompletten Datensatz auf einmal zu importieren?
Edit: Wichtig natürlich - erst mal auf einer, dann auf ein paar Dateien testen. Man will ja nicht nach 2 Stunden feststellen, dass was schief gelaufen ist.
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
das hat super geklappt. Ich habe es jetzt soweit ausgebaut, dass ich alle .txt-Dateien des Ordners G6_Test entsprechend durchgehen und die neuen Tabellen schreiben kann. Es dauert zwar seine Zeit, aber bringt mich zu dem gewünschten Ergebnis.
Code:
% Das ist mein gesamtes Programm, vielleicht Hilft es sonst noch jemand bei ähnlichen Problemstellungen.
% Ordner-Pfad, in dem sich die Dateien befinden.
myFolder = 'C:\Users\Admin\Desktop\G6_Test';
% Überprüfen, ob der Ordner vorhanden ist. % Benutzer warnen, wenn dies nicht der Fall ist. if ~ isfolder (myFolder)
errorMessage = sprintf('Fehler: Der folgende Ordner existiert nicht: \ n% s \ nBitte geben Sie einen neuen Ordner an.', myFolder);
uiwait (warndlg(errorMessage));
myFolder = uigetdir();
if myFolder == 0 return;
end end
zusätzliche Tipps:
1. falls du bei dir Unterverzeichnisse erfassen willst, hilft **
2. bei mehreren Durchläufen darauf achten, dass neue Ergebnisse nicht an bereits bestehende Dateien angehängt werden
Grüße,
Harald
_________________
1.) Ask MATLAB Documentation
2.) Search gomatlab.de, google.de or MATLAB Answers
3.) Ask Technical Support of MathWorks
4.) Go mad, your problem is unsolvable ;)
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.