Was Klitzekleines:
Gegeben sei eine Datei, die Adressen und Zusatzinfos in festen Bytegrößen ablegt - aber ohne die üblichen Trennzeichen. Ein Datensatz hat eben genau 1760 Byte, die einzelnen Felder auch feste Größen. Damit ich die Daten in einen mySQL-Table einlesen kann, brauche ich aber Trenner.
Dem Programm sollen die Größen von Daten satz und Datenfeldern sowie die gewünschten Trenner übergeben werden.
mySQL Import
Nur mal schnell hingehackt:
Ich vermute mal ein DS soll auch in einer zeile stehen.
joe
Code: Alles auswählen
data = "aaaabbbbbbbeessqqqqttttxxxxxxbkkqqyyyyYYYYLLLLLLLFFBBIIII"
def trennerEinfuegen(daten,feldlaengen,trenner):
ret = ""
curpos = 0
while 1:
if curpos >= len(data):
break
for feldlaenge in feldlaengen:
ret += daten[curpos:curpos+feldlaenge]+trenner
curpos += feldlaenge
ret = ret.rstrip(";")
ret += "\n"
return ret
print trennerEinfuegen(data,(4,7,2,2,4),";")
joe
Die Lösung wird immer langsamer, weil das Ergebnis immer im Speicher umherkopiert wird. Der Speicherverbrauch ist Eingabedaten + (2 * Endergebnis).
Hier eine Lösung mit linearer Laufzeit und konstantem Speicherverbrauch, welche die Eingabedaten aus einem Dateiobjekt liest und in ein anderes schreibt:
Man könnte noch einen Test hinzufügen, ob die Eingabedaten einen der beiden Trenner enthalten.
Hier eine Lösung mit linearer Laufzeit und konstantem Speicherverbrauch, welche die Eingabedaten aus einem Dateiobjekt liest und in ein anderes schreibt:
Code: Alles auswählen
#!/usr/bin/env python
import StringIO
import sys
data = "aaaabbbbbbbeessqqqqttttxxxxxxbkkqqyyyyYYYYLLLLLLLFFBBIIII"
def copy_with_delimiters(infile, outfile, field_lengths, field_delimiter=';',
record_delimiter='\n'):
while True:
fields = map(infile.read, field_lengths)
if fields[0] == '':
break
outfile.write(field_delimiter.join(fields))
outfile.write(record_delimiter)
infile = StringIO.StringIO(data)
outfile = sys.stdout
copy_with_delimiters(infile, outfile, (4, 7, 2, 2, 4))