Seite 2 von 2

Verfasst: Freitag 4. September 2009, 11:12
von b.esser-wisser
@quant: Kannst du mal präzise deine Probleme beschreiben - mit "Der macht ärger", "geht nicht" etc. kann niemand was anfangen.

Hast du noch Probleme mit dem Ablauf?
1. finde eine Zeile die mit "0" fängt (nicht mit 0 oder " 0" oder "\t0")
2. in der nächsten Zeile kommt jetzt:
- die Anzahl an 'incoming'-Zeilen im Zeichen 0, d.h. im ersten Zeichen
- die Anzahl an 'outgouing'-Zeilen, Zeichen 1 bis 8 (woher weiß ich das?)
3. die nächsten Zeilen (wieviele?) sind incoming-Zeilen, die Zahl, die du hier suchst steht an Zeichen 149 bis 159, bzw. in Python "aktuelle_zeile[149:160]"
4. die nächsten Zeilen sind 'outgoing'-Zeilen -- Die können auch fehlen
weiter zu 1.

Arbeite auf jeden Fall das Tutorial durch - offiziell in englisch in der/deiner Python-Documentation, oder (IIRC im Python-Wiki) auf Deutsch.

hth. Jörg

Verfasst: Freitag 4. September 2009, 14:10
von quant
hey

also ich hab folgendes problem ... in der ENTRY_OUT schleife ist die outgoing variable aus mir unverständlichen gründen 0, obwohl sie vorher noch die richtige zahl hat, welche ich vorher ja einlese

Code: Alles auswählen


# /usr/bin/python
# coding:utf-8

import pprint
DATAFILE = "fort.15"
# 'enum' is sometimes dearly missed
SCAN, ENTRY_HEAD, ENTRY_IN, ENTRY_OUT = range(4)
def main():
    #to hold all extracted data,
    events = []
    state = SCAN
    with open(DATAFILE) as data_fd:
        for line in data_fd:
            if state == SCAN and line[0] == "0":
                    incoming = outgoing = 0
                    state = ENTRY_HEAD
            elif state == ENTRY_HEAD or \
                    (state == SCAN and line[0] in "123456789"):
                #prepare counter
                if line[0] in "123456789" and not line[2:9] in "0":
                    incoming,outgoing = int(line[0:1]), int(line[2:9])
                    #create new entry
                    events.append( dict(incoming=[], outgoing=[]) )
                    #local shortcuts (I'm a lazy typist)
                    in_tmp = events[-1]["incoming"]
                    out_tmp = events[-1]["outgoing"]
                    # select next state
                    state = ENTRY_IN if incoming else ENTRY_OUT
            elif state == ENTRY_IN:
#                in_tmp.append(int(line[156:160]))
                incoming -= 1
#             print outgoing
                if not incoming:
                    state = ENTRY_OUT
            elif state == ENTRY_OUT:
#                out_tmp.append(int(line[149:161]))
                print outgoing # hier ist sie 0...
                outgoing -= 1
                if not outgoing:
                    state = SCAN
            else:
#                # print "impossible state:", state
                raise IOError("file wrongly formatted")
    for data in events:
        pprint.pprint(data)
               
if "__main__" == __name__ : main()
ansonsten ist mir die logic schon klar vom ganzen

Verfasst: Freitag 4. September 2009, 14:37
von b.esser-wisser
line[2:9] in "0"
funktioniert definitiv nicht - probier's im interpreter aus
int(line[2:9]) == 0
geht wahrscheinlich besser.
Aber: Gib doch besser das Ergebnis nach den Incoming-Zeilen aus, wenn outgoing==0 ist, und überspring "ENTRY_OUT" einfach.