mySQL Import

Du hast eine Idee für ein Projekt?
Antworten
Witwe Bolte

Donnerstag 26. Mai 2005, 09:16

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.
Gast

Donnerstag 26. Mai 2005, 12:30

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
BlackJack

Freitag 27. Mai 2005, 21:58

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.
Antworten