Seite 1 von 1
Textdatei umformatieren
Verfasst: Montag 13. September 2010, 21:37
von at2511
Bin absoluter Python-Neuling und brauche dringend ein paar Tips die mir weiterhelfen.
Habe folgende txt-Datei (Auszug) die ich umformatieren muss:
KILOME 0.0113
X-KOO -16.07 -6.87 -2.99 0.00 1.80 4.65
5.20 5.58 6.00 6.42 6.80 7.35
Y-KOO 53.72 53.80 53.80 53.76 53.53 52.14
51.48 51.23 51.18 51.23 51.48 52.07
KILOME 0.056
X-KOO -167.00 -148.70 -16.06 0.00 1.00 4.65
5.20 5.58 6.00 6.42 6.80 7.35
9.00 10.15 28.62
Y-KOO 55.50 53.59 53.57 53.58 53.44 52.27
51.69 51.44 51.39 51.44 51.69 52.33
53.18 53.94 60.32
Ergebnis soll folgendermaßen aussehen:
KILOME X-KOO Y-KOO
0.0113 -16.07 53.72
0.0113 -6.87 53.80
...
0.056 28.62 60.32
Zeilenweises einlesen der Datei und Ausgabe in eine neue Datei habe ich noch hin bekommen, aber jetzt hakt es völlig bei dem pärchenweise zusammensetzen aus unterschiedlichen Zeilen.
Mache ich das am Besten über eine Liste? Wie greift man auf einzelne Einträge einer Listenzeile zu?
Freue mich über eine paar Tips in die richtige Richtung!
Re: Textdatei umformatieren
Verfasst: Montag 13. September 2010, 22:12
von BlackJack
@at2511: Man könnte sich da einen
Zustandsautomaten basteln und den als Programm umsetzen.
Re: Textdatei umformatieren
Verfasst: Dienstag 14. September 2010, 19:25
von DaMutz
Da ich mich ein bisschen mit PLY (Python Lex-Yacc) beschäftigte, habe ich deine Aufgabe damit umgesetzt (Vielleicht ein bisschen übertrieben).
Hier meinen Vorschlag:
http://www.python-forum.de/pastebin.php?mode=view&s=65
gegen Verbesserungsvorschläge habe ich nichts einzuwenden...
Re: Textdatei umformatieren
Verfasst: Dienstag 14. September 2010, 19:44
von BlackJack
Ich habe mich auch mal dran versucht, mit Bordmitteln:
http://paste.pocoo.org/show/262097/
Das ist der zweite Anlauf. Der erste war auf der einen Seite einfacher, aber auf der anderen Seite in *einer* Funktion die viel zu lang war.
Re: Textdatei umformatieren
Verfasst: Dienstag 14. September 2010, 21:15
von numerix
Ich bin da eher ein Freund kurzer Lösungen:
Code: Alles auswählen
infile = open("old.txt")
data = infile.read()
infile.close()
outfile = open("new.txt","w")
outfile.write("KILOME X-KOO Y-KOO\n")
for entry in data.split("KILOME")[1:]:
vals = entry.split()
km = vals.pop(0)
lgs = vals.index("Y-KOO")
for x,y in zip(vals[1:lgs],vals[lgs+1:]):
outfile.write("%s %s %s\n" %(km,x,y))
outfile.close()
Ja, ich weiß, dass man Dateien anders einlesen sollte ....
Re: Textdatei umformatieren
Verfasst: Dienstag 14. September 2010, 23:00
von Barabbas
Meine Lösung möchte ich auch nur kurz einstellen, weil sie seit gestern auf der HD liegt
Code: Alles auswählen
import re
import StringIO
s= """KILOME 0.0113
X-KOO -16.07 -6.87 -2.99 0.00 1.80 4.65
5.20 5.58 6.00 6.42 6.80 7.35
Y-KOO 53.72 53.80 53.80 53.76 53.53 52.14
51.48 51.23 51.18 51.23 51.48 52.07
KILOME 0.056
X-KOO -167.00 -148.70 -16.06 0.00 1.00 4.65
5.20 5.58 6.00 6.42 6.80 7.35
9.00 10.15 28.62
Y-KOO 55.50 53.59 53.57 53.58 53.44 52.27
51.69 51.44 51.39 51.44 51.69 52.33
53.18 53.94 60.32"""
l = re.split(" |\n", s)
d = []
current_element = None
elements = ["X-KOO", "Y-KOO", "KILOME"]
for field in l:
if field == "KILOME":
current_element = field
d.append({"KILOME":None,"X-KOO":[], "Y-KOO":[]})
continue
elif field == "X-KOO" or field == "Y-KOO":
current_element = field
continue
for e in elements:
if current_element == "KILOME":
d[-1]["KILOME"] = field
break
elif current_element == e and field != e:
d[-1][e].append(field)
break
for dataset in d:
print "\n\nKILOME" + "\t\t" + "X-KOO" + "\t\t" + "Y-KOO"
for i in range(0, len(dataset["X-KOO"])):
print dataset["KILOME"] + "\t\t"+ dataset["X-KOO"][i] + "\t\t" + dataset["Y-KOO"][i]
Re: Textdatei umformatieren
Verfasst: Dienstag 14. September 2010, 23:26
von BlackJack
Inspiriert von DaMutz auch noch eine Lösung mit einem Parser, in diesem Fall `pyparsing`:
Code: Alles auswählen
from itertools import izip, repeat
from pyparsing import Group, OneOrMore, Regex, StringEnd, Suppress, ZeroOrMore
HEADERS = KILOMETER, X_COORDINATES, Y_COORDINATES = 'KILOME', 'X-KOO', 'Y-KOO'
def define_grammar():
number = Regex(r'-?[0-9]+(\.[0-9]*)?')
numbers = OneOrMore(number)
kilometer = Suppress(KILOMETER) + number
x_coordinates = Group(Suppress(X_COORDINATES) + numbers)
y_coordinates = Group(Suppress(Y_COORDINATES) + numbers)
record = Group(kilometer + x_coordinates + y_coordinates)
records = ZeroOrMore(record)
return records
def transform(ast):
yield HEADERS
for kilometer, x_coordinates, y_coordinates in ast:
for row in izip(repeat(kilometer), x_coordinates, y_coordinates):
yield row
def main():
grammar = define_grammar()
ast = grammar.parseFile('test.txt')
for row in transform(ast):
print ' '.join(row)
if __name__ == '__main__':
main()
Re: Textdatei umformatieren
Verfasst: Mittwoch 15. September 2010, 11:19
von numerix
Dann hoffen wir mal, dass den OP das auch immer noch interessiert ...
Re: Textdatei umformatieren
Verfasst: Mittwoch 15. September 2010, 16:40
von DaMutz
numerix hat geschrieben:Dann hoffen wir mal, dass den OP das auch immer noch interessiert ...
Das spielt mir keine Rolle, ich habe was gelernt und das ist die Hauptsache (für mich auf jeden Fall).
@BJ: Deine pyparsing Lösung finde ich sehr schön. Im 'Programming in Python 3' Buch ist PLY und pyparsing erklärt. Im Buch hat mir PLY besser gefallen, darum habe ich es auch damit versucht, aber die pyparsing Methode ist kompakter. Das liegt eventuell auch daran, dass ich es nicht sehr geschickt implementiert habe...
Re: Textdatei umformatieren
Verfasst: Mittwoch 15. September 2010, 19:21
von at2511

Vielen Dank für die tolle Hilfe!!
Ich habe aus Zeitmangel nur die kurze Lösung ausprobiert und sie funktioniert genauso wie ich sie benötige.