Seite 1 von 1

Tabelle zu Beziehungspaaren umwandeln

Verfasst: Mo 27. Mär 2023, 17:36
von michaa7
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 .... ;)

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Mo 27. Mär 2023, 19:19
von echo
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

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Mo 27. Mär 2023, 21:28
von michaa7
Danke dir. Da werde ich lange drann sitzen bis ich verstehe was du gemacht hast. ;-) Zumindest weiß ich nun dass es geht.

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Di 28. Mär 2023, 11:24
von echo
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.

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Di 28. Mär 2023, 14:10
von karolus
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

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Mi 29. Mär 2023, 01:57
von michaa7
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!

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Mi 29. Mär 2023, 07:11
von RPP63
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"

Re: Tabelle zu Beziehungspaaren umwandeln

Verfasst: Do 30. Mär 2023, 01:15
von michaa7
@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.

Verfasst: Fr 31. Mär 2023, 10:47
von Lupo
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