Seite 1 von 2
dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 14:23
von jens
Ich habe Daten die in einem verschachtelten dict vorliegen. Hier:
https://github.com/jedie/DragonPy/blob/ ... L122-L2042
Daraus erzeuge ich auch eine csv:
https://github.com/jedie/DragonPy/blob/ ... a_raw2.csv
Daraus wiederum habe ich eine Tabelle gemacht, hier:
https://docs.google.com/spreadsheet/ccc ... tSFE#gid=1
Wie man sehen kann, haben einige Zellen vertikal den selben Inhalt. Wie kann ich diesen auf einfacher Weise zusammenfassen lassen. Also "Zelle verbinden" nutzten?
Natürlich unabhängig von der google seite oder Excel, calc..
Beim csv export kann man IMHO keine Meta-Daten wie "Verbundene Zellen" angeben, oder?
Welchen export könnte man also machen damit man "Verbundene Zellen" erzeugen kann?
HTML-Tabelle, xls erzeugen?
Sehe gerade, das XlsxWriter das können soll. HTML-Tabelle generieren wäre aber ehr mein Ding.
Ideen?
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 14:29
von Hyperion
Was ist denn das Ziel? Soll das eine Datenstruktur zur Weiterverarbeitung sein oder eine zum Ausdrucken?
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 14:35
von jens
Das Ziel ist nur von den Daten eine übersichtlichere Tabelle zu erhalten. Ähnlich wie diese hier:
http://koti.mbnet.fi/~atjs/mc6809/Information/6809.htm
EDIT: Ob nun in Excel/Calc oder google Tabellen, egal. Wobei mir halt einfaches HTML erst mal am besten erscheint.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 14:37
von Hyperion
Dann würde ich HTML passend finden. Ließe sich - je nach Wunsch - per CSS noch grafisch anpassen und kann aber durchaus auch noch maschinell weiterverarbeitet werden.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 14:39
von jens
Per CSS? Wie soll das gehen?
Könnte mir höchstens eine JS Lösung vorstellen. Wäre auch nett. Mal suchen...
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 15:11
von EyDu
Du hast den Hinweis von Hyperion glaube ich falsch verstanden. Du erstellst die Tabelle mit HTML und wenn du diese ausdrucken oder anzeigen möchtest, dann kannst du den Style der Tabelle/Zeilen/Spalten/Zellen mit CSS anpassen.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 15:47
von Hyperion
@EyDu: Jo, genau so war es gemeint!
Die Struktur der Tabelle wird natürlich im HTML-Code selber definiert!
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:04
von jens
Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?
Beispiel:
Code: Alles auswählen
+-----+--...
| foo | ...
+-----+--...
| foo | ...
+-----+--...
| | ...
...
soll da zu dem werden:
Code: Alles auswählen
+-----+--...
| | ...
+ foo +--...
| | ...
+-----+--...
| | ...
...
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:23
von EyDu
jens hat geschrieben:Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?
Gar nicht, das musst du schon im HTML-Teil zusammengefasst haben.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:24
von jens
Genau und darum dreht sich meine Eingangsfrage

Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:27
von Sirius3
@jens: wenn Du es nur für die Anzeige brauchst, würde ich auch direkt HTML schreiben.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:33
von jens
Jup. Aber gibt es eine modul welches den export erleichtert/automatisiert?
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 21. Oktober 2013, 16:44
von BlackJack
@jens: Die üblichen Verdächtigen bei den Template-Engines. Jinja2 zum Beispiel.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Sonntag 6. Juli 2014, 20:40
von jens
Stehe wieder vor dem selben Problem und finde keine elegante Lösung.
Mal ein Konkretes Beispiel. Gegeben ist sowas:
Code: Alles auswählen
[('SUB', 'SUBA', '0x80'),
('SUB', 'SUBA', '0x90'),
('SUB', 'SUBA', '0xa0'),
('SUB', 'SUBA', '0xb0'),
('SUB', 'SUBB', '0xc0'),
('SUB', 'SUBB', '0xd0'),
('SUB', 'SUBB', '0xe0'),
('SUB', 'SUBB', '0xf0'),
('SUB', 'SUBD', '0x83'),
('SUB', 'SUBD', '0x93'),
('SUB', 'SUBD', '0xa3'),
('SUB', 'SUBD', '0xb3')]
Raus kommen soll das:
Code: Alles auswählen
+-----+------+------+
| SUB | SUBA | 0x80 |
| | | 0x90 |
| | | 0xa0 |
| | | 0xb0 |
+ +------+------+
| | SUBB | 0xc0 |
| | | 0xd0 |
| | | 0xe0 |
| | | 0xf0 |
+ +------+------+
| | SUBD | 0x83 |
| | | 0x93 |
| | | 0xa3 |
| | | 0xb3 |
+-----+------+------+
Aber halt als HTML Tabelle, also:
Code: Alles auswählen
<table>
<tr>
<td rowspan="12">SUB</td>
<td rowspan="4">SUBA</td>
<td>0x80</td>
</tr>
<tr>
<td>0x90</td>
</tr>
<tr>
<td>0xa0</td>
</tr>
<tr>
<td>0xb0</td>
</tr>
<tr>
<td rowspan="4">SUBB</td>
<td>0xc0</td>
</tr>
<tr>
<td>0xd0</td>
</tr>
<tr>
<td>0xe0</td>
</tr>
<tr>
<td>0xf0</td>
</tr>
<tr>
<td rowspan="4">SUBD</td>
<td>0x83</td>
</tr>
<tr>
<td>0x93</td>
</tr>
<tr>
<td>0xa3</td>
</tr>
<tr>
<td>0xb3</td>
</tr>
</table>
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Sonntag 6. Juli 2014, 20:43
von cofi
Ich wuerde das Problem ja an
prettytable weiterreichen.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Sonntag 6. Juli 2014, 21:16
von BlackJack
@cofi: Soweit ich das sehe kann `prettytable` da nichts machen. `rowspan`\s kann das nicht. Und es bleibt ja immer noch das eigentliche Problem zu erkennen was zusammengefasst werden kann/muss.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Sonntag 6. Juli 2014, 21:33
von jens
cofi hat geschrieben:Ich wuerde das Problem ja an
prettytable weiterreichen.
Ja, das ist schon nett. Aber ich sehe da nichts über verbundene Zellen...
Hier meine ziemlich dumme Lösung:
Code: Alles auswählen
class Cell(object):
def __init__(self, txt):
self.txt = txt
self.rowspan = 0
def html(self):
if self.rowspan is None:
return ""
elif self.rowspan == 1:
return "<td>%s</td>" % self.txt
return '<td rowspan="%i">%s</td>' % (self.rowspan, self.txt)
def __str__(self):
return "<'%s' rowspan=%s>" % (self.txt, self.rowspan)
__repr__ = __str__
data = [('SUB', 'SUBA', '0x80'),
('SUB', 'SUBA', '0x90'),
('SUB', 'SUBA', '0xa0'),
('SUB', 'SUBA', '0xb0'),
('SUB', 'SUBB', '0xc0'),
('SUB', 'SUBB', '0xd0'),
('SUB', 'SUBB', '0xe0'),
('SUB', 'SUBB', '0xf0'),
('SUB', 'SUBD', '0x83'),
('SUB', 'SUBD', '0x93'),
('SUB', 'SUBD', '0xa3'),
('SUB', 'SUBD', '0xb3')]
new_data = []
for row in data:
new_data.append([Cell(cell) for cell in row])
data = new_data
for colum_no in xrange(len(data[0])):
old_cell = None
same_count = 0
for row in reversed(data) :
cell = row[colum_no]
if old_cell is None:
old_cell = cell
same_count = 1
elif cell.txt == old_cell.txt:
old_cell.rowspan = None
old_cell = cell
same_count += 1
else:
old_cell.rowspan = same_count
old_cell = cell
same_count = 1
old_cell.rowspan = same_count
print "<table>"
for row in data:
print "\t<tr>"
for cell in row:
if cell.rowspan is not None:
print "\t\t%s" % cell.html()
print "\t</tr>"
print "</table>"
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Sonntag 6. Juli 2014, 21:47
von EyDu
Zeilen 31 bis 34 kannst du kürzer schreiben als:
Und Zeilen 43, 47 und 51 solltest du hinter den if/elif/else-Block ziehen und zusammenfassen.
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 7. Juli 2014, 08:11
von jens
Danke für die Anregungen... Man kann auch diese zwei Schleifen zusammen fassen, wenn es keine tuple() sind:
Code: Alles auswählen
class Cell(object):
def __init__(self, txt):
self.txt = txt
self.rowspan = 0
def html(self):
if self.rowspan is None:
return ""
elif self.rowspan == 1:
return "<td>%s</td>" % self.txt
return '<td rowspan="%i">%s</td>' % (self.rowspan, self.txt)
def __str__(self):
return "<'%s' rowspan=%s>" % (self.txt, self.rowspan)
__repr__ = __str__
data = [['SUB', 'SUBA', '0x80'],
['SUB', 'SUBA', '0x90'],
['SUB', 'SUBA', '0xa0'],
['SUB', 'SUBA', '0xb0'],
['SUB', 'SUBB', '0xc0'],
['SUB', 'SUBB', '0xd0'],
['SUB', 'SUBB', '0xe0'],
['SUB', 'SUBB', '0xf0'],
['SUB', 'SUBD', '0x83'],
['SUB', 'SUBD', '0x93'],
['SUB', 'SUBD', '0xa3'],
['SUB', 'SUBD', '0xb3']]
# Wenn es doch tuple sind:
# data = [list(row) for row in data]
for colum_no in xrange(len(data[0])):
old_cell = None
same_count = 0
for row in reversed(data):
cell = row[colum_no]=Cell(row[colum_no])
if old_cell is None:
same_count = 1
elif cell.txt == old_cell.txt:
old_cell.rowspan = None
same_count += 1
else:
old_cell.rowspan = same_count
same_count = 1
old_cell = cell
old_cell.rowspan = same_count
print "<table>"
for row in data:
print "\t<tr>"
for cell in row:
if cell.rowspan is not None:
print "\t\t%s" % cell.html()
print "\t</tr>"
print "</table>"
Dennoch finde ich das recht unelegant, oder?
Re: dict als tabelle mit verbunden Zellen ausgeben...
Verfasst: Montag 7. Juli 2014, 09:23
von jerch
@jens:
Eher als Anregung - ich bau mir solche "Datenblätter" lieber als eigenständiges interaktives HTML-Dokument mit der Präsentationslogik in Javascript als festgezurrt durch ein Template. Denkbar wäre z.B. Sortierung durch Klick auf Tabellenkopf, Suchfilter oder Anzeigen von zusätzlichen Inhalten bei Klick auf einen Eintrag. Falls solche Dinge wichtig sein sollten, wirds mit der pythonseitigen Aufbereitung schwierig. Da bist Du mit dem rohen Datensatz und der Bearbeitung in Javascript besser beraten.