Seite 1 von 1
mySQL Import
Verfasst: Donnerstag 26. Mai 2005, 09:16
von Witwe Bolte
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.
Re: mySQL Import
Verfasst: Donnerstag 26. Mai 2005, 12:30
von Gast
Nur mal schnell hingehackt:
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),";")
Ich vermute mal ein DS soll auch in einer zeile stehen.
joe
Verfasst: Freitag 27. Mai 2005, 21:58
von BlackJack
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:
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))
Man könnte noch einen Test hinzufügen, ob die Eingabedaten einen der beiden Trenner enthalten.