dbf Datein verschmelzen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
mupic
User
Beiträge: 11
Registriert: Montag 21. Juli 2008, 18:20

dbf Datein verschmelzen

Beitragvon mupic » Dienstag 22. Juli 2008, 17:25

Hallo,

ich habe 365 DBF Datein. Jede enthält 2 Spalten:

Nr. Wert
1 121
2 254
3 487
4 354
5 154
...

Ich möchte die zu einer verschmelzen:

Nr Wert Wert1 Wert2 Wert3
...

Vom Format her sind die exakt gleich.

Kann mir da jemand helfen? Gibt es da eine schnelle Lösung in Python?
Bin Anfänger und irgend etwas kompliziertes werde ich nicht umsetzen können.
Einen Tip für ein anderes Programm das das kann wäre auch schon hilfreich!

Danke!

[/list]
Zuletzt geändert von mupic am Dienstag 22. Juli 2008, 17:30, insgesamt 1-mal geändert.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Re: dbf Datein verschmelzen

Beitragvon audax » Dienstag 22. Juli 2008, 17:29

mupic hat geschrieben:Hallo,

ich habe 365 DBF Datein. Jede enthält 2 Spalten:

Nr. Wert
1 121
2 254
3 487
4 354
5 154
...

Ich möchte die zu einer verschmelzen:

Nr Wert Wert1 Wert2 Wert3

gib mal ein konkretes Beispiel. Ich versteh das Problem nicht ganz :D
mupic
User
Beiträge: 11
Registriert: Montag 21. Juli 2008, 18:20

Beitragvon mupic » Dienstag 22. Juli 2008, 17:39

Ok. Also ich habe für eine Reihe von geographischen Punkten (1800 Stück) für jeden Tag eines Jahres Einstrahlungswerte berechnet. Die Ausgabe erfolgte als dbf Datein (Ascii). Allerdings habe ich jetzt für jeden Tag eine Datei. Ich muss die nun aber unbedingt in eine Ascii Datei bekommen.

Tag 1:
Punkt Einstrahlungswert
1 354
2 644
...

Tag 2:
Punkt Einstrahlungswert
1 247
2 358
...

Jetzt suche ich irgendeine Möglichkeit, diese vielen Tabellen zu einer zu verschmelzen. Rein theoretisch würde es reichen, wenn ich aus jeder dbf Datei die 2. Spalte auslesen und diese dann in einen neuen file schreiben könnte. Anschließend die jeweils 2. Spalte der anderen Tabellen auch in diesen neuen File einfügen. Ergebnis sollte eine Tabelle mit 365 Werten haben.
Ich brauche diese, um sie wieder mit den geographischen Punkten zu kombinieren. Klicke ich dann einen Punkt an, dann zeigt er mir für jeden Tag des Jahres die modellierten Einstrahlungswerte an.

Aber wie bekomme ich diese vielen dbf zusammen?
Benutzeravatar
BlackVivi
User
Beiträge: 762
Registriert: Samstag 9. Dezember 2006, 14:29
Kontaktdaten:

Beitragvon BlackVivi » Dienstag 22. Juli 2008, 18:02

2 Funktionen fielen mir ein...

Die erste erwartet *args aus Dateinamen und gibt'n Dic zurück, die 2te erwartet ein Dic und gibt eine List zurück, die aus Listen besteht...

[[1, 1231231, 124321, 32131, 13132], [2, 1321321, 321321, 321321, 132132], ...]

Du musst halt schauen wie dolle du das halt wiederbenutzbar machen willst... also wie stark abstrahieren.
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Dienstag 22. Juli 2008, 18:06

Code: Alles auswählen

#-*- coding: utf-8 -*-

# das Einlesen der Datei sollte ja kein Problem sein...
day_1 = """\
Punkt Einstrahlungswert
1 354
2 644"""

day_2 = """\
Punkt Einstrahlungswert
1 247
2 358 """

def extract(text):
    # text aufteilen
    lines = text.splitlines()
    # erste Zeile entfernen
    lines = lines[1:]
    # erste Spalte entfernen
    values = []
    for line in lines:
        point, value = line.split()
        values.append(value)
    return values


total = []
total += extract(day_1)
total += extract(day_2)

print total

Ergebnis:

Code: Alles auswählen

['354', '644', '247', '358']


So war das gemeint, oder?

€dit:
Ahhh!
Genau falsch verstanden!
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Dienstag 22. Juli 2008, 18:10

Code: Alles auswählen

#-*- coding: utf-8 -*-

# das Einlesen der Datei sollte ja kein Problem sein...
day_1 = """\
Punkt Einstrahlungswert
1 354
2 644"""

day_2 = """\
Punkt Einstrahlungswert
1 247
2 358 """

def extract(text, data):
    # text aufteilen
    lines = text.splitlines()
    # erste Zeile entfernen
    lines = lines[1:]
    for line in lines:
        point, value = line.split()
        if not point in data:
            data[point] = []
        data[point].append(value)
        # alternativ:
        # data.get(point, []).append(value)
    return data

data = {}
extract(day_1, data)
extract(day_2, data)
print data

Code: Alles auswählen

{'1': ['354', '247'], '2': ['644', '358']}

So nun aber.
mupic
User
Beiträge: 11
Registriert: Montag 21. Juli 2008, 18:20

Beitragvon mupic » Dienstag 22. Juli 2008, 18:21

Hi,

ja genau so soll es aussehen, nur dass die Reihen dann untereinander in eine Datei ausgegeben werden.

Bitte hilf mir noch beim Einlesen und Auslesen der Datei. Bei meinem letzten script habe ich eine Textdatei folgendermaßen eingelesen:

Code: Alles auswählen

f = open('E:\\Staff\\test\\sample.txt', 'r')
s = f.read().splitlines()
vals = [dict(zip(s[0].split(), line.split())) for line in s[1:]]


Wenn ich das wieder benutze, wie spreche ich da die komplette 2 Reihe an und wie schreibe ich diese in eine neue Datei? Kann Python meine dbf auch lesen? Dann müßte ich das wiederholen und immer wieder diese neue Datei mit einer Spalte erweitern.

Danke erstmal!
audax
User
Beiträge: 830
Registriert: Mittwoch 19. Dezember 2007, 10:38

Beitragvon audax » Dienstag 22. Juli 2008, 18:35

mupic hat geschrieben:Hi,

ja genau so soll es aussehen, nur dass die Reihen dann untereinander in eine Datei ausgegeben werden.

Bitte hilf mir noch beim Einlesen und Auslesen der Datei. Bei meinem letzten script habe ich eine Textdatei folgendermaßen eingelesen:

Code: Alles auswählen

f = open('E:\\Staff\\test\\sample.txt', 'r')
s = f.read().splitlines()
vals = [dict(zip(s[0].split(), line.split())) for line in s[1:]]


Wenn ich das wieder benutze, wie spreche ich da die komplette 2 Reihe an und wie schreibe ich diese in eine neue Datei? Kann Python meine dbf auch lesen? Dann müßte ich das wiederholen und immer wieder diese neue Datei mit einer Spalte erweitern.

Danke erstmal!

Nach dem Code hast du ein Dictionary mit {point: value} und du musst nur ein neues Dictionary bilden mit {point: [value, value, ...]}. Aller Code den du dafür brauchst steht sogar schon hier im Thread.

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder