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?
dict als tabelle mit verbunden Zellen ausgeben...
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
Was ist denn das Ziel? Soll das eine Datenstruktur zur Weiterverarbeitung sein oder eine zum Ausdrucken?
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
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.
EDIT: Ob nun in Excel/Calc oder google Tabellen, egal. Wobei mir halt einfaches HTML erst mal am besten erscheint.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
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.
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
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.
Das Leben ist wie ein Tennisball.
- Hyperion
- Moderator
- Beiträge: 7478
- Registriert: Freitag 4. August 2006, 14:56
- Wohnort: Hamburg
- Kontaktdaten:
@EyDu: Jo, genau so war es gemeint! 
Die Struktur der Tabelle wird natürlich im HTML-Code selber definiert!
Die Struktur der Tabelle wird natürlich im HTML-Code selber definiert!
encoding_kapiert = all(verstehen(lesen(info)) for info in (Leonidas Folien, Blog, Folien & Text inkl. Python3, utf-8 everywhere))
assert encoding_kapiert
assert encoding_kapiert
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?
Beispiel:
soll da zu dem werden:
Beispiel:
Code: Alles auswählen
+-----+--...
| foo | ...
+-----+--...
| foo | ...
+-----+--...
| | ...
...Code: Alles auswählen
+-----+--...
| | ...
+ foo +--...
| | ...
+-----+--...
| | ...
...Gar nicht, das musst du schon im HTML-Teil zusammengefasst haben.jens hat geschrieben:Was CSS macht ist mir schon klar. Aber wie soll ich automatisiert per CSS Zellen zusammenfassen wenn der Inhalt gleich ist?
Das Leben ist wie ein Tennisball.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Stehe wieder vor dem selben Problem und finde keine elegante Lösung.
Mal ein Konkretes Beispiel. Gegeben ist sowas:
Raus kommen soll das:
Aber halt als HTML Tabelle, also:
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')]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>- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Ich wuerde das Problem ja an prettytable weiterreichen.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
-
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.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Ja, das ist schon nett. Aber ich sehe da nichts über verbundene Zellen...cofi hat geschrieben:Ich wuerde das Problem ja an prettytable weiterreichen.
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>"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.
Code: Alles auswählen
data = [map(Cell, row) for row in data]Das Leben ist wie ein Tennisball.
- jens
- Python-Forum Veteran
- Beiträge: 8502
- Registriert: Dienstag 10. August 2004, 09:40
- Wohnort: duisburg
- Kontaktdaten:
Danke für die Anregungen... Man kann auch diese zwei Schleifen zusammen fassen, wenn es keine tuple() sind:
Dennoch finde ich das recht unelegant, oder?
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>"@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.
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.
