🙏 Helfen Sie jetzt mit, unser LibreOffice Forum zu erhalten! 🙏
Mit Ihrer Spende sichern Sie den Fortbestand, den Ausbau und die laufenden Kosten dieses Forums. 🌱

🍀 Jeder Beitrag zählt – vielen Dank für Ihre Unterstützung!🍀

❤️ DANKE >> << DANKE ❤️

>> Dank Ihrer Unterstützung -> Keine Werbung für alle registrierten LibreOffice-Forum User! <<
🤗 Als Dankeschön werden Sie im Forum als LO-SUPPORTER gekennzeichnet. 🤗

Tabelle zu Beziehungspaaren umwandeln

CALC ist die Tabellenkalkulation, die Sie immer wollten.
Antworten
michaa7
Beiträge: 118
Registriert: Do 27. Okt 2011, 16:12

Tabelle zu Beziehungspaaren umwandeln

Beitrag von michaa7 » Mo 27. Mär 2023, 17:36

Gegeben ist eine Tabelle mit identischen Bezeichungen in der ersten Spalte und der ersten Reihe. Die Zellen sind entweder leer oder enthalten ein X

Code: Alles auswählen

      value1 value2 value3 value4
value1 -   x         leer        leer
value2 x      -     leer     x
value3 x     x      -      x
value4 x     x      x       -
Das soll nach der Umwandlung da stehen:
value1,value2
value2,value1
value2, value4
value3,value1
value3,value2
value3, value4
value4,value1
value4,value2
value4, value3

Zu deutsch, dort wo ein X im Kreuzungspunkt der Tabelle steht soll aus den beiden Bezeichnungen ein Paar gebildet werden. Alle paare sollen zusammen in einer Doppelspalte gelistet werden. Ich habe das noch nciht ausprobiert aber irgendwie stelle ich mir vor dass ich mit "wenn "X" in Zelle, dann Wert von "<Spalte von Zelle>1" -> schreiben nach <eine Zelle> UND Wert von "<Reihe von Zelle>1" -> schreiben nach Zelle neben <eine Zelle>. Das mag ich vielleicht für einen Treffer hinbekommen.
Aber die "Treffer" sind, anders als im Beispiel, selten und es gibt viele Leerzellen. Gibt es überhaupt eine Möglichkeit sowas wie "in die nächsten beiden freien Zellenpaare unterhalb" schreiben.

BTW: für mich ist das eine Spielerei ob ich das irgendwie hin bekomme. Da sollte niemand der hilft mit Bierernst daran gehen .... ;)

echo
Beiträge: 247
Registriert: Do 27. Jan 2022, 09:53

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von echo » Mo 27. Mär 2023, 19:19

BTW: für mich ist das eine Spielerei ob ich das irgendwie hin bekomme.
hallo, dito
wenn man die relevanten Zellen auf <>"" prüft kann man diese Zeilen und Spalten ausgeben.
Ich habe das mal in einer Hilfsspalte gemacht und dann die Überschriften abgefragt.

Gruß Holger
Dateianhänge
Unbenannt 1.ods
(18.78 KiB) 165-mal heruntergeladen

michaa7
Beiträge: 118
Registriert: Do 27. Okt 2011, 16:12

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von michaa7 » Mo 27. Mär 2023, 21:28

Danke dir. Da werde ich lange drann sitzen bis ich verstehe was du gemacht hast. ;-) Zumindest weiß ich nun dass es geht.

echo
Beiträge: 247
Registriert: Do 27. Jan 2022, 09:53

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von echo » Di 28. Mär 2023, 11:24

michaa7 hat geschrieben:
Mo 27. Mär 2023, 21:28
Danke dir. Da werde ich lange drann sitzen bis ich verstehe was du gemacht hast. ;-) Zumindest weiß ich nun dass es geht.
irgendwie stelle ich mir vor dass ich mit "wenn "X" in Zelle, dann Wert von "<Spalte von Zelle>1" -> schreiben nach <eine Zelle> UND Wert von "<Reihe von Zelle>1" -> schreiben nach Zelle neben <eine Zelle>
hallo
genau so habe ich es gemacht :D
Die (Matrix-)Wennformel prüft aber nicht nur eine Zelle sondern durchläuft alle Zellen.
Das Ergebnis ist eine Reihe von "" ; "" ; 50007 ; "" ; "" ; 60013 ; "" ..... usw. (Wert oder "" (Nix)).
Die Zahlen beschreiben dabei alle Positionen der nicht leeren Zellen.
Die Zahlen werden mit KKLEINSTE aufsteigend sortiert in die Hilfsspalte geschrieben.
Wennfehler verhindert dann noch die Fehlermeldung wenn es keine weiteren Zahlen gibt.
Das Ergebnis lässt sich jetzt leicht wieder in Zeile und Spalte zerlegen und mit Index die Überschriften ermitteln.

Gruß Holger
PS: bin mir sehr sicher das es auch komplett ohne Hilfsspalte geht. Der Weg sollte ähnlich sein.
schau dir mal die Funktion AGGREGAT() an.

Benutzeravatar
karolus
* LO-Experte *
Beiträge: 2539
Registriert: Fr 10. Dez 2010, 10:01

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von karolus » Di 28. Mär 2023, 14:10

Hallo
Weils geht:
Selektiere den Bereich mit den Daten (einschliesslich Kopfzeile und Kopfspalte) und:

Code: Alles auswählen

from functools import partial

def revert_cross_table_keys(*_):    
    doc = XSCRIPTCONTEXT.getDocument()
    sel = doc.CurrentSelection
    sheet = sel.Spreadsheet
    header_row, *data = sel.DataArray
    header_row = header_row[1:]
    p_zip = partial(zip, header_row)
    out = []
    for key, *row in data:
        out.extend([(key,  c_key) for c_key, entry in p_zip(row) if entry])
    cursor = sheet.createCursorByRange(sel)
    cursor.gotoOffset(len(header_row)+2, 0)
    cursor.collapseToSize(len(out[0]),len(out))
    cursor.DataArray = out
Die Ausgabe der Schlüsselpaare erfolgt rechts neben dem selektierten Bereich.
Und zum organisieren deiner pythonscripte nimmst du apso.oxt
LO7.4.7.5 debian 12(bookworm) auf Raspberry4b 8GB (64bit)
LO24.8.0.3 flatpak debian 12(bookworm) auf Raspberry4b 8GB (64bit)

michaa7
Beiträge: 118
Registriert: Do 27. Okt 2011, 16:12

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von michaa7 » Mi 29. Mär 2023, 01:57

echo hat geschrieben:
Di 28. Mär 2023, 11:24
...
genau so habe ich es gemacht :D
Die (Matrix-)Wennformel prüft aber nicht nur eine Zelle sondern durchläuft alle Zellen.
Das Ergebnis ist eine Reihe von "" ; "" ; 50007 ; "" ; "" ; 60013 ; "" ..... usw. (Wert oder "" (Nix)).
Die Zahlen beschreiben dabei alle Positionen der nicht leeren Zellen.
Die Zahlen werden mit KKLEINSTE aufsteigend sortiert in die Hilfsspalte geschrieben.
Wennfehler verhindert dann noch die Fehlermeldung wenn es keine weiteren Zahlen gibt.
Das Ergebnis lässt sich jetzt leicht wieder in Zeile und Spalte zerlegen und mit Index die Überschriften ermitteln.
...
Diese Erklärung und die Bezugnahme auf meinen Pseudocode sind sehr hilfreich für mich. Das vereinfacht das Nachvollziehen sehr. Danke!

Benutzeravatar
RPP63
Beiträge: 172
Registriert: Sa 21. Apr 2018, 09:33

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von RPP63 » Mi 29. Mär 2023, 07:11

Moin!
Was Du da als Basis hast, nennt sich Kreuztabelle und stellt "eigentlich" bereits eine Auswertung dar, die man "normalerweise" mittels Pivot-Tabelle erstellt.
Heißt:
Dass, was Du erstellen willst, sollte besser die Datenbasis in Form einer "maschinenlesbaren" Liste sein.

Nach diesem Wort zum Mittwoch sei mir ein kleiner Off-topic-Exkurs gestattet:
In Excel lässt sich die Aufgabe mit wenigen Klicks generieren:
• beliebige Zelle im Bereich markieren → Daten → Aus Tabelle
• im Editor Spalte 1 markieren → Transformieren, Andere Spalten entpivotieren
Jetzt könnte man noch die letzte Spalte entfernen, Schließen & Laden

Ausgangstabelle:
Bild

Resultat:
Bild

Selbständig generierter M-Code:

Code: Alles auswählen

let
    Quelle = Excel.CurrentWorkbook(){[Name="Tabelle2"]}[Content],
    #"Entpivotierte andere Spalten" = Table.UnpivotOtherColumns(Quelle, {"Name"}, "Attribut", "Wert"),
    #"Entfernte Spalten" = Table.RemoveColumns(#"Entpivotierte andere Spalten",{"Wert"})
in
    #"Entfernte Spalten"
Ein Feedback auf eine gegebene Lösung tut nicht weh und zeigt Querlesern, dass das Problem gelöst ist.

michaa7
Beiträge: 118
Registriert: Do 27. Okt 2011, 16:12

Re: Tabelle zu Beziehungspaaren umwandeln

Beitrag von michaa7 » Do 30. Mär 2023, 01:15

@echo
Nochmals Danke

@karolus
hatte deinen post hier übersprungen, ist natürlich schick, werde ich morgen in LO einbauen, weiß ja jetzt wie es geht.

@RPP63
wg Auswertung und Datenbasis. Genau, ich will die Datenbasis. Hab ich aber nicht. Hab nur Tabellen ..... aus dem Netz ;-)

wg. Excel: müsste ich mal bei MS anrufen ob die ne Linux Version bereitstellen (ein Scherz, zur Sicherheit)
danke auch dir.

Melde mich nochmal wenn ich an der ganzen Sache noch etwas weiter geschnitzt habe.

Lupo
Beiträge: 279
Registriert: Do 11. Okt 2012, 14:22

Beitrag von Lupo » Fr 31. Mär 2023, 10:47

Excel für Linux: Kamel und Nadelöhr.

Aber halt! Da war doch was (Du brauchst nur ein kostenloses MS-Konto)

Hier der Link zu einer Excel-Online-Beispiel-UNPIVOT-Datei (nur Formel, kein PQ, kein BASIC):
1drv.ms/x/s!AsnnAXrDppAdnT5RibMfMoBF9u6-?e=jEEA0t
MfG Lupo - xxcl.de Win10ProLO6062


An alle, die das LibreOffice-Forum gern nutzen und unterstützen wollen:


Bitte helfen Sie uns mit 7 Euro pro Monat.
Durch Ihren Beitrag tragen Sie dazu bei, unsere laufenden Kosten für die kommenden Monate zu decken.
Unkompliziert per Kreditkarte oder PayPal.
Als ein kleines Dankeschön werden Sie im LO-Forum als SUPPORTER gekennzeichnet.



Antworten