Seite 1 von 1

Problem mit Tabellenformatierung (2D Liste)

Verfasst: Freitag 5. Mai 2006, 17:09
von keboo
Hallo Leute!

Ich hab folgendes Problem:

Ich will Daten aus einer Inputdatei einlesen und austauschen.

Die Inputdatei sieht so aus:

<data1> <data2> <data3> <data4>

Die Abstände sind variabel zwischen den Überschriften. Das heisst, die Anzahl der zwischenliegenden Leerzeichen variiert.

In einer Liste habe ich die Werte von den Stellen an welchen "<" vorkommt. Unter jedem "<" sollen die Werte einer 2D Liste kommen.

Code: Alles auswählen

stellen_list=[0,12,20,34]

2d_list=[['11111','11111','11111','/n'],['2222','22222','2222','/n'],['3333','33333','33333','/n'],['44444','44444','44444','/n']]
Ich möchte nun, dass die 2d_list so angepasst wird, dass die Werte beim Ausgeben in ein File (die Datenüberschrift bleibt bestehen) immer genau unter unter den '<' stehen.

Ich weiß, dass ich mich ein wenig kompliziert ausgedrückt habe.
Wär mir eine super Freude, wenn mir wer helfen könnte.

Danke.

Johannes

Verfasst: Freitag 5. Mai 2006, 18:49
von knekke
Hier ist mal ein ganz ganz grober Ansatz. Die längen der Strings in 'werte' sind auch noch nicht berücksichtigt, und es lässt sich auch bestimmt irgendwie in eine Schleife basteln, aber dafür ist es dann doch nur zu sehr Hobby, als dass ich das so auf die schnelle könnte :wink:

Code: Alles auswählen

stellen=[0,12,20,34]
werte=[['11111','11111','11111','/n'],['2222','22222','2222','/n'],['3333','33333','33333','/n'],['44444','44444','44444','/n']]

pos1 = stellen[0]*' '
pos2 = (stellen[1]-stellen[0])*' '
pos3 = (stellen[2]-stellen[1]-stellen[0])*' '
pos4 = (stellen[3]-stellen[2]-stellen[1]-stellen[0])*' '

print pos1+werte[0][0]+pos2+werte[1][0]+pos3+werte[2][0]+pos4+werte[3][0]
print pos1+werte[0][1]+pos2+werte[1][1]+pos3+werte[2][1]+pos4+werte[3][1]
print pos1+werte[0][2]+pos2+werte[1][2]+pos3+werte[2][2]+pos4+werte[3][2]

Verfasst: Freitag 5. Mai 2006, 21:53
von BlackJack
Du könntest Dir eine passenden Formatierungszeichenkette basteln (lassen):

Code: Alles auswählen

columns = [0, 12, 20, 34]
data = [['11111', '11111', '11111', '/n'],
        ['2222', '22222', '2222', '/n'],
        ['3333', '33333', '33333', '/n'],
        ['44444', '44444', '44444', '/n']]

format = ''.join('%%-%ds' % (end - start)
                 for start, end in zip(columns, columns[1:])) + '%s'
for row in data:
    print format % tuple(row)

Verfasst: Samstag 6. Mai 2006, 08:09
von jens
@keboo: Kennst du %30s bzw. %-30s ?

Hier ein Beispiel:

Code: Alles auswählen

o = ""
for i in xrange(10):
    o += "X"
    print "|%30s|" % o

o = ""
for i in xrange(10):
    o += "X"
    print "|%-30s|" % o
Ausgabe:

Code: Alles auswählen

|                             X|
|                            XX|
|                           XXX|
|                          XXXX|
|                         XXXXX|
|                        XXXXXX|
|                       XXXXXXX|
|                      XXXXXXXX|
|                     XXXXXXXXX|
|                    XXXXXXXXXX|
|X                             |
|XX                            |
|XXX                           |
|XXXX                          |
|XXXXX                         |
|XXXXXX                        |
|XXXXXXX                       |
|XXXXXXXX                      |
|XXXXXXXXX                     |
|XXXXXXXXXX                    |

Verfasst: Samstag 6. Mai 2006, 09:57
von keboo
hallo leute!

@ blackjack:

Ich hab das Problem, dass manchmal in columns der erste Wert größer ist als 0. Es sollen vor dem ersten Wert die Anzahl an Leerzeichen entsprechend dem ersten Wert in columns hinzugefügt werden. Wie kann ich das machen?

@ jens:

ich kenne das noch nicht. wie kann ich das in meinem Fall verwenden?
als neuling ist mir das leider ein wenig zu abstrakt. wäre super wenn du mir einen hinweis geben könntest.

danke an euch,

johannes

Verfasst: Samstag 6. Mai 2006, 10:35
von keboo
habs gelöst, danke!

johannes

Verfasst: Samstag 6. Mai 2006, 11:00
von Joghurt
keboo hat geschrieben:habs gelöst, danke!
Dann schreib auch wie.

Vielleicht hat jemand später genau dasselbe Problem und findet diesen Thread mit der Forumssuche.

Verfasst: Sonntag 7. Mai 2006, 22:20
von keboo
Hallo!

Habs mit einer leichten Anpassung von Black Jacks Code gelöst.
Danke nochmals dafür. Und danke dafür, dass du mich auf eine neue Art der Stringverarbeitung gebracht hast.

Hab an der jeweils ersten Stelle von data die erste stelle von columns * leerzeichen eingefügt.

Das wars.

Danke.
johannes