Verfasst am: 26.02.2016, 02:28
Titel: Einzelne Werte aus Variable suchen und in neue schreiben
Guten Abend,
trotz der Tatsache, dass ich mich mittlerweile etwas intensiver mit Matlab auseinandersetzen kann und bereits einige Dinge besser verstehe (dieses Forum ist mir dabei eine ENORME Hilfe!), stoße ich leider immer noch schnell an meine Grenzen.
Folgender für mich komplizierter Sachverhalt:
Mir liegen zwei Excel-Tabellen vor. Die eine Tabelle (datum) beinhaltet in ihrer ersten Spalte zahlreiche Unternehmen. In ihren folgenden Spalten besitzt die Tabelle hingegen Datumsangaben, welche beliebig lang sind. Zellen die nicht mit Datumsangaben belegt sind sind mit NA beschrieben.
Die zweite Tabelle (werte) besitzt in ihrer ersten Spalte ebenfalls zahlreiche Unternehmensnamen. Hinzukommt, dass besagte Tabelle in ihrer ersten Zeile zahllose Datumsangaben besitzt. Weiterhin verfügt die Tabelle in ihren weiteren Zeilen und Spalten über Zahlen in den einzelnen Zellen, aber auch über NA-Angaben.
Nun ist mein Wunsch, dass ausgehend von den einzelnen Zeilen der jeweiligen Unternehmensnamen auf die entsprechenden Datumsangaben der Tabelle datum zugegriffen wird. Beide dort gefundenen Angaben (Unternehmen und jeweiliges Datum) sollen nun hinüber in die zweite Tabelle werte genommen und dort ebenfalls miteinander kombiniert werden. Das Ziel ist, dass die Zelle in der sich die Unternehmensangabe (repräsentiert durch die Zeile) und das Datum (repräsentiert durch die Spalte) kreuzen jeweils ausgewählt und in eine neue Tabelle geschrieben wird. Besagte Tabelle soll die gleiche Struktur wie die Tabelle datum aufweisen. Der Unterschied ist lediglich, dass an Stelle der Datumsangaben die für diese gefundenen Werte aus der zweiten Tabelle stehen.
Leider fehlt mir bei diesem Vorhaben größtenteils der Ansatz für eine Programmierung. Ich kann die Tabellen zwar einlesen, doch fällt mir die Kombination aus Zeilen und Spalten sehr schwer.
Folgendes habe ich soweit anzubieten:
Code:
% Einlesen der zwei Tabellen datum und werte [~, ~, datum] = xlsread('Beispiel.xlsx', 'datum');
[~, ~, werte] = xlsread('Beispiel.xlsx', 'werte');
% Datumsvektor aus werte
datumVektor = werte(1, 2:end);
Um meine Schwierigkeiten (und mein Vorhaben) nicht nur verbal, sondern auch grafisch darzulegen, habe ich mehrere Beispieldateien dem Anhang beigefügt. Hierzu zählt sowohl eine Excel-Datei, als auch um der derzeitigen Unsicherheitssituation Rechnung zu tragen drei Matlab-Dateien. Die dritte Datei (das dritte Excel-Blatt) ist dabei eine Ergebnisdatei. In dieser (diesem) ist dargestellt, wie ich mir das schlussendliche Ergebnis wünsche. Weiterhin werde ich dem Anhang auch drei Screenshots beifügen, so dass ein Kompromiss zwischen der Excel-Datei und den Matlab-Dateien hergestellt wird.
In der Excel-Datei (dem Screenshots) ist der exemplarisch zu betrachtende Bereich gelb markiert. Zusätzlich ist die Schrift des zugehörigen Datums rot und die des Unternehmens blau gefärbt. Der sich in diesem einen Beispiel ergebene Wert welcher in die neue Variable überführt werden soll ist in weißer Schrift auf rotem Grund gehalten.
Leider ist es nicht möglich mehr als fünf Anhänge anzuhängen. Daher habe ich mich entschlossen, diesen Beitrag zu ergänzen, um auch die drei Screenshots beifügen zu können.
Das macht es nämlich für die anschließende Suche in der Wertetabelle deutlich einfacher, erst nach dem Namen und dann zum Namen die vorhanden Daten durchgehen und den Wert zu lesen. Etwas unvorteilhaft ist allerdings, dass du bei den Unternehmensnamen auch noch den Zusatz - Datum bzw. - Betrag hast. Aber da könnte man sonst mit
umsetzen. Aber in irgendeiner Form wirst du die Daten für die jeweilige Firma trennen müssen. Sonst wird die Suche in den Tabellen einfach unnötig kompliziert.
Falls du eine derartige Zuordung schon hast, wäre es sinnvoll sie zur Verfügung zu stellen.
Inwiefern ist der Code mit der Datei nicht ausführbar? Die einzige (kleine) Schwierigkeit, die ich sehe, ist, dass die im
xlsread
-Befehl jeweils befindliche Datei ein .xlsx hat. Dies ist das normale Dateiformat, mit dem ich arbeite. Für das Forum hätte ich die Endung auf .xls anpassen müssen aber sonst?
Eine weitere Problematik besteht darin, dass warum auch immer aus dem Excel-Tabellenblatt werte mehrere Zeilen/Spalten ohne Inhalt eingelesen werden. Die entsprechenden Zellen werden dann von Matlab vollständig als NaN erfasst. Die von mir zur Verfügung gestellten .mat-Dateien wurden von mir in dieser Hinsicht bereits korrigiert. Sofern lieber die Excel-Datei eingelesen werden soll, können die entsprechenden Zeilen/Spalten wie folgt entfernt werden:
Die Variablen unternehmenDatum und unternehmenWerte habe ich aus den Variablen datum und werte erzeugt. Meine Vorstellung war, dass man diese möglicherweise für einen späteren Vergleich nutzen könnte, um die Unternehmenszeilen in den Variablen passgenau zu ermitteln. Im Übrigen beinhalten beide Variablen den Spaltenvektor mit den Unternehmensbegriffen (ohne Zusatz von - Datum bzw. - Betrag).
Sofern ich es korrekt verstehe, ergänzt man die Inhalte in einem Struct manuell. Das mag bei diesem Beispiel funktionieren. Die große Herausforderung ist jedoch, dass die Dateien welche ich eigentlich zu bearbeiten gedenke über 1.000 verschiedene Unternehmen (und damit Zeilen) sowie über 6.000 Datumspalten besitzen. Ein manuelles Suchen und Eintragen ist damit unmöglich.
Im Übrigen beinhalten beide Variablen den Spaltenvektor mit den Unternehmensbegriffen (ohne Zusatz von - Datum bzw. - Betrag).
Weder werte.mat noch datum.mat enthalten nur den Namen. Und wenn man ergebnis.mat lädt, wird die zuvor geladene werte.mat überschrieben, da identischer Variablenname
Und nein...das struct soll natürlich nicht manuell erstellt werden. Das lässt sich aus den Tabellen extrahieren. Das sollte imho aber als erstes gemacht werden, bevor man sich dann um die Suche nach Werten kümmert. Leider ist der Aufbau der Tabellen ungeeignet um es ganz einfach mit
cell2struct
zu lösen.
Ich habe jetzt noch einmal auf einem zweiten PC probiert die Excel-Datei (diese habe ich hier zuvor ebenfalls heruntergeladen) zu öffnen. Auch dort trat kein Fehler auf.
Bzgl. der nur den Unternehmensnamen enthaltenen Variablen reden wir offenbar ein wenig an einander vorbei. Nicht die von mir eingelesenen und zur Verfügung gestellten Variablen werte.mat und datum.mat enthalten diese Information. Die Unternehmensnamen sollen erst mit den zwei Befehlen:
aus den zwei zur Verfügung gestellten Variablen herausgelöst werden.
Was natürlich sein kann ist, dass dieses Vorgehen für mein jetziges Vorhaben Quatsch ist. Das kann ich als Matlab- und Programmieranfänger allerdings (noch) nicht überblicken.
Betreffend der Datei ergebnis.mat und der damit verbundenen Variablenbezeichnung hast du recht (die Uhrzeit war wohl schon zu spät). Somit habe ich den Variablennamen korrigiert und die Datei hier erneut angefügt. Letztendlich dient ergebnis.mat jedoch nur als Anschauungs- und nicht als Berechnungsobjekt. Eine Betrachtung des exemplarischen Ergebnisses kann auch über die beigefügten Screenshots erfolgen.
Unabhängig von den oberen Inhalten werde ich versuchen, die von dir geschilderten Möglichkeiten nachzuvollziehen und schauen, wie weit ich komme. Vielen Dank dafür!
ergebnis = datum;
ergebnis(:,1) = strrep(ergebnis(:,1), 'Datum', 'Ergebnis');
for I = 1:size(ergebnis, 1) for J = 2:size(ergebnis,2)
row = find(strcmp(unternehmenDatum{I}, unternehmenWerte));
col = find(strcmp(datum{I, J}, werte(1,2:end))) + 1;
if ~isempty(col)
ergebnis{I,J} = werte{row, col};
end end end
Ansonsten stimme ich DSP insofern zu, dass du ja nun anscheinend mehr mit diesen Daten arbeiten musst und daher dir einmal Gedanken über eine vernünftige Datenorganisation machen solltest. Dass die momentane Form nicht gerade ideal ist, merkst du ja an der Mühe, die das Arbeiten mit den Daten kostet.
Vielen Dank für die zusätzlichen Hiweise bzgl. des structs , DSP!
Ganz phantastisch, Harald! Dein Code brachte mir die Lösung für mein Problem. Herzlichen Dank!
Die Erstellung eines structs werde ich auch bald angehen, weshalb ich den Status dieses Themas zunächst einmal als offen beibehalten werde.
Viele Grüße
DasFragezeichen
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.