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

Einzelne Werte aus Variable suchen und in neue schreiben

 

DasFragezeichen
Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 13.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2016, 02:28     Titel: Einzelne Werte aus Variable suchen und in neue schreiben
  Antworten mit Zitat      
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);

% Unternehmensbezeichnungen heraustrennen für möglichen Spaltenvergleich
unternehmenDatum = cellfun(@(str) str(1:end-7), datum(:,1), 'UniformOutput', false);
unternehmenWerte = cellfun(@(str) str(1:end-8), werte(:,1), 'UniformOutput', false);
 


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.

Herzlichen Dank für die Hilfe!

Viele Grüße
DasFragezeichen

datum.mat
 Beschreibung:
Matlab-Variable --> "datum"

Download
 Dateiname:  datum.mat
 Dateigröße:  15.77 KB
 Heruntergeladen:  333 mal
werte.mat
 Beschreibung:
Matlab-Variable --> "werte"

Download
 Dateiname:  werte.mat
 Dateigröße:  98.01 KB
 Heruntergeladen:  334 mal
ergebnis.mat
 Beschreibung:
Matlab-Variable --> Schlussendlich gewünschtes Ergebnis

Download
 Dateiname:  ergebnis.mat
 Dateigröße:  14.83 KB
 Heruntergeladen:  292 mal
Beispiel.xls
 Beschreibung:
Excel-Datei mit drei Blättern "datum", "werte", "ergebnis"

Download
 Dateiname:  Beispiel.xls
 Dateigröße:  50.5 KB
 Heruntergeladen:  335 mal


Zuletzt bearbeitet von DasFragezeichen am 26.02.2016, 02:49, insgesamt einmal bearbeitet
Private Nachricht senden Benutzer-Profile anzeigen


DasFragezeichen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 13.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2016, 02:31     Titel:
  Antworten mit Zitat      
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.

Viele Grüße
DasFragezeichen

datum-Variable.jpg
 Beschreibung:
"datum" Variable

Download
 Dateiname:  datum-Variable.jpg
 Dateigröße:  145.51 KB
 Heruntergeladen:  275 mal
werte-Variable.jpg
 Beschreibung:
"werte" Variable

Download
 Dateiname:  werte-Variable.jpg
 Dateigröße:  163.48 KB
 Heruntergeladen:  292 mal
schlussendliches_Ergebnis.jpg
 Beschreibung:
Schlussendlich gewünschtes Ergebnis

Download
 Dateiname:  schlussendliches_Ergebnis.jpg
 Dateigröße:  112.06 KB
 Heruntergeladen:  281 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.02.2016, 09:55     Titel:
  Antworten mit Zitat      
Hallo,

da der Code nicht mit der Beispiel.xls ausführbar ist, mal noch ein paar Fragen?

Was haben "unternehmenDatum" und "unternehmenWerte" mit den *.mat Dateien zu tun? Gleicher Inhalt?

Ich würde mir zunächst mal einen
Code:
erstellen, welcher Unternehmensname und die dazugehörigen Daten beinhaltet.

Code:

% 1. Firma
Unternehmen(1).Name = 'Firma xyz';
Unternehmen(1).Daten = {'01.11.2011';'05.11.2011';'14.11.2011';'29.11.2011'};
Unternehmen(1).Werte = [];
% 2. Firma
Unternehmen(2).Name = 'Firma abc';
Unternehmen(2).Daten = {...};
Unternehmen(2).Werte = [];
 


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
Code:
nach dem Namen in der Tabelle suchen.

Man kann die Ordnung der Daten natürlich auch z.B. als
Code:
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.

Gruß DSP
Private Nachricht senden Benutzer-Profile anzeigen
 
DasFragezeichen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 13.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2016, 13:29     Titel:
  Antworten mit Zitat      
Vielen Dank für deine Nachricht, DSP.

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:

Code:

% Entfernen überflüssiger Zeilen
werte(8:end, :) = []

% Entfernen überflüssiger Spalten
werte(:, 38:end) = [];
 



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.

Viele Grüße
DasFragezeichen
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 26.02.2016, 13:42     Titel:
  Antworten mit Zitat      
Die Endung habe ich bereits auf .xls geändert und erhalte dennoch eine Fehlermeldung.

Code:
Error using xlsread (line 247)
XLSREAD unable to read sheet 'datum'.
File contains unexpected record length.  Try saving as Excel 98.


Error in readxls (line 2)
[~, ~, datum] = xlsread('Beispiel.xls', 'datum')


Zitat:
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 Wink

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.
Private Nachricht senden Benutzer-Profile anzeigen
 
DasFragezeichen
Themenstarter

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 13.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 26.02.2016, 19:57     Titel:
  Antworten mit Zitat      
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. Smile 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:

Code:

% Unternehmensbezeichnungen heraustrennen für möglichen Spaltenvergleich
unternehmenDatum = cellfun(@(str) str(1:end-7), datum(:,1), 'UniformOutput', false);
unternehmenWerte = cellfun(@(str) str(1:end-8), werte(:,1), 'UniformOutput', false);
 


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!

Viele Grüße
DasFragezeichen

ergebnis.mat
 Beschreibung:
Korrigierte Variable "ergebnis"

Download
 Dateiname:  ergebnis.mat
 Dateigröße:  14.83 KB
 Heruntergeladen:  320 mal
Private Nachricht senden Benutzer-Profile anzeigen
 
DSP
Forum-Meister

Forum-Meister



Beiträge: 2.117
Anmeldedatum: 28.02.11
Wohnort: ---
Version: R2014b
     Beitrag Verfasst am: 27.02.2016, 00:00     Titel:
  Antworten mit Zitat      
Hallo,

wenn du die Firmennamen schon in einem cell array hast, kannst du damit schon mal das struct anlegen.

Code:

names = {'Firma 1';'Firma 2';'Firma 3';'Firma 4';'Firma 5'}

% struct erzeugen
Unternehmen = struct('Name',names,'Daten',[],'Werte',[])

Unternehmen =

5x1 struct array with fields:

    Name
    Daten
    Werte

% Zugriff auf struct-felder folgend

>> Unternehmen(1)

ans =

     Name: 'Firma 1'
    Daten: []
    Werte: []

>> Unternehmen(1).Name

ans =

Firma 1
 


Daten und Werte müssten dann wohl in Schleifen gefüllt werden. Aber durch den struct ist das Zuordnen der Daten und Werte imho einfacher.

Gruß DSP
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: 27.02.2016, 01:15     Titel:
  Antworten mit Zitat      
Hallo,

mal auf die Schnelle und mit for-Schleifen:

Code:
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.

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

Forum-Anfänger

Forum-Anfänger


Beiträge: 32
Anmeldedatum: 13.12.15
Wohnort: ---
Version: ---
     Beitrag Verfasst am: 05.03.2016, 18:05     Titel:
  Antworten mit Zitat      
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
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.