Verfasst am: 22.02.2016, 02:30
Titel: Diverse String-Elemente zwischen zwei Tabellen vergleichen
Guten Abend,
nach wie vor sitze ich an mehreren großen Excel-Tabellen, welche ich mit Matlab verändern muss.
Mein Vorhaben habe ich in einer beigefügten Excel-Tabelle illustriert. Die rot eingefärbten Texte der einzelnen Zeilen von der Referenztabelle (Referenz) sollen mit jenen der Vergleichstabelle (Vergleich) verglichen werden. Stimmen sie überein, sollen sie beibehalten und in eine neue Ergebnistabelle geschrieben werden. Liegen die String-Bezeichnungen nur in der Vergleichstabelle vor, so sollen die entsprechenden Zeilen nicht in die neue Ergebnistabelle geschrieben werden. Die Ergebnis-Tabelle kann dabei gerne die veränderte Vergleichstabelle sein. Die gelb markierten Zeilen dienen in diesem Beispiel lediglich der besseren Illustration dafür, welche Zeilen schlussendlich übernommen werden sollen.
Soweit so gut . So wie sich mir der Sachverhalt als Anfänger darstellt, könnten die Funktionen cellfun und strcmp sinnvoll sein.
Jetzt erschließt sich mir jedoch nicht, wie ich die sich stets ändernden String-Elemente sinnvoll in die Funktion cellfun integrieren kann. Bisher hatte ich nur einen konkreten String, nachdem ich die einzelnen Zellen durchsucht habe.
Für die Realisierung meines Vorhabens wird vermutlich sowohl auf die Referenztabelle, als auch auf die zu verändernde Tabelle der cellfun-Befehl angewendet werden. Auf Grundlage der Ergebnisse erfolgt wahrscheinlich anschließend der Vergleich mittels strcmp. In einem letzten Schritt werden die sich ergebenen überschüssigen Zeilen entfernt.
Soviel zu meiner möglicherweise fehlerhaften Theorie.
Verfasst am: 22.02.2016, 12:21
Titel: Re: Diverse String-Elemente zwischen zwei Tabellen vergleich
Hallo DasFragezeichen,
Eine Excel-Tabelle mit Matlab zu bearbeiten, ist grundsätzlich keine gute Idee. Ich würde das entweder in Excel direkt lösen, oder aber die Daten importieren und dann ein reines Matlab-Problem daraus machen.
Da ich zur Zeit aus gegebenem Anlass keine Excel-Files aus unbekannten Quellen öffne, kann ich das Probel nicht nachvollziehen. Könntest Du die Daten importieren und in Matlab-Syntax posten?
ich vermute mal, dass statt Unternehmen 1-10 echte Unternehmensnamen in der Tabelle stehen.
Wird auf dem einen Sheet immer "- Wert" und auf dem anderen immer "- Betrag" angefügt? Können die Unternehmensnamen Leerzeichen enthalten? Bindestriche?
Eine Excel-Tabelle mit Matlab zu bearbeiten, ist grundsätzlich keine gute Idee. Ich würde das entweder in Excel direkt lösen, oder aber die Daten importieren und dann ein reines Matlab-Problem daraus machen.
Hallo Jan,
vermutlich habe ich mich (auch aufgrund der Uhrzeit ) etwas missverständlich ausgedrückt. Die Excel-Daten habe ich natürlich in Matlab über den bekannten Code importiert:
Code:
% Einlesen von Referenztabelle [~, ~, Referenz] = xlsread('Beispiel.xls', 'Referenz');
% Einlesen von Vergleichstabelle [~, ~, Vergleich] = xlsread('Beispiel.xls', 'Vergleich');
Da ich zur Zeit aus gegebenem Anlass keine Excel-Files aus unbekannten Quellen öffne, kann ich das Probel nicht nachvollziehen. Könntest Du die Daten importieren und in Matlab-Syntax posten?
Dass du (und auch andere) gegenwärtig keine Excel-Dateien aus fremden Quellen importierst kann ich nachvollziehen. Daher habe ich besagte drei (inkl. der gewünschten Ergebnistabelle) Datenblätter in Matlab importiert und stelle sie hier zur Verfügung.
Harald hat Folgendes geschrieben:
Hallo,
ich vermute mal, dass statt Unternehmen 1-10 echte Unternehmensnamen in der Tabelle stehen.
Hallo Harald,
In der Tat stehen in der richtigen Tabelle (mit über 1.000 Unternehmen) richtige Unternehmensnamen.
Harald hat Folgendes geschrieben:
Wird auf dem einen Sheet immer "- Wert" und auf dem anderen immer "- Betrag" angefügt? Können die Unternehmensnamen Leerzeichen enthalten? Bindestriche?
In dem einen Tabellenblatt werden so wie du sagtest immer "- Wert" und auf dem anderen immer "- Betrag" angefügt.
Harald hat Folgendes geschrieben:
Können die Unternehmensnamen Leerzeichen enthalten? Bindestriche?
Die Unternehmensnamen enthalten so mein Eindruck leider mitunter eine Vielzahl an zusätzlichen Zeichen. Dazu gehören Leerzeichen, Bindestriche, aber auch Mal ein Punkt oder . Zudem tauchen ab und an auch & sowie / und Zahlen auf.
Für mich als Laie liest sich das Ganze wieder so, als würde die entsprechende Programmierung (abermals) unheimlich kompliziert werden .
Viele Grüße
DasFragezeichen
ergebnis.mat
Beschreibung:
Ergebnistabelle aus Excel-Datei des ersten Beitrags.
das Hauptproblem ist die - nett ausgedrückt - sehr ungeschickte Kombination verschiedener Informationen in einer Zelle. Solltest du einen Einfluss auf das Datenformat haben, sollte man das also schon an dieser Stelle angehen.
Besten Dank, Harald für den tollen Code! Ich frage mich ein um das andere Mal, wie lange es wohl dauert, bis man (ich) eine derartige Programmierleistung ebenfalls fertig bringt (bringe)... .
Eine (hoffentlich) kleine Problematik besteht jedoch noch...:
Neben meiner Beispieldatei - bei welcher der Code wunderbar funktioniert - habe ich den programmierten Inhalt auch versucht, auf meine richtigen Dateien zu überragen. Dies funktionierte auch sehr gut bis zu der letzten Zeile:
Gebe ich diese ein, so erscheint folgende Fehlermeldung: "Subscript indices must either be real positive integers or logicals."
In diesem Zug habe ich etwas recherchiert und habe mir die "loc"-Variable etwas genauer angesehen. Neben den korrekten Zeilenangaben weist besagte Variable an einigen Stellen auch Nullen aus. Dies geschieht manches Mal sogar in dem Fall, wenn zuvor bspw. die Zahl 1546 und nach der Null die Zahl 1547 notiert wurde. Zudem habe ich an mindestens einer Stelle - mitten in der "loc"-Variable die Zahl 5 gesehen - und das, obwohl vor- und nachher Werte im vierstelligen Bereich vorkommen.
Alles in allem vermute ich, dass der Fehler mit den Nullen (und ggf.) der fünf in Zusammenhang steht. Nur wie kann es dazu kommen? Es müssten doch anhand der Befehle problemlos alle überflüssigen Werte ausgesondert werden?! Oder liegt das Problem darin, dass ein Wert aus der Referenztabelle nicht in der Vergleichstabelle existiert? Dies Fehlen habe ich auch soeben festgestellt. Was könnte man gegen dieses Problem unternehmen? Ein umgekehrtes Vergleichen (Vergleichstabelle als Referenztabelle und Referenztabelle als Vergleichstabelle) dürfte ja an und für sich nicht funktionieren.
Vielen Dank!
Viele Grüße
DasFragezeichen
P.S. Die "loc"-Variable habe ich - sofern benötigt - diesem Beitrag angehängt.
wenn du die Beschreibung des zweiten Rückgabearguments von ismember in der Doku liest, dann siehst du, dass das Verhalten so durchaus Sinn ergibt.
Zitat:
Neben den korrekten Zeilenangaben weist besagte Variable an einigen Stellen auch Nullen aus.
... was bedeutet, dass unternehmenReferenz nicht in vergleichReferenz gefunden werden konnte.
Zitat:
Dies geschieht manches Mal sogar in dem Fall, wenn zuvor bspw. die Zahl 1546 und nach der Null die Zahl 1547 notiert wurde.
Dann fehlte halt der Eintrag zwischen den beiden.
Zitat:
Zudem habe ich an mindestens einer Stelle - mitten in der "loc"-Variable die Zahl 5 gesehen - und das, obwohl vor- und nachher Werte im vierstelligen Bereich vorkommen.
Was bedeuten würde, dass die Reihenfolge der Unternehmen sehr unterschiedlich ist.
Intuitiv würde ich sagen: es sollte reichen, die Nullen zu ignorieren.
Selbst wenn es keine Fehlermeldungen gibt, bitte stichprobenartig überprüfen, ob die Ergebnisse wie erwartet sind.
Falls nicht, bitte alle beteiligten Variablen zur Verfügung stellen. loc alleine ist nicht sehr aussagekräftig.
Die kleine - aber notwendige Ergänzung - war der Schlüssel zur Lösung. Zudem helfen mir die Hinweise mich zukünftig wieder etwas besser in Matlab zurecht finden zu können.
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.