Seite 2 von 2

Re: CSV Modul

Verfasst: Dienstag 26. September 2017, 21:27
von noisefloor
Hallo,

wenn du zeilenweise über die Daten iteriest, dann hast du einen "einfachen" Index, also z.B. `row[2]` für das 3. Element der Zeile.

Gruß, noisefloor

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 09:47
von Camu
Hallo,

ich habe nun etwas weiter herumprobiert. Momentan frage ich ab, ob in einer Zelle ein Wert vorhanden ist (mach das ganze mit einer einfachen 2-zeiligen csv datei) und wenn ja soll er diesen importieren. Dies funktioniert glaub ich soweit, nun hänge ich aber an dem Insert-Befehl für die MySQL Datenbank. Wie müsste denn dieser aussehen das er in sensor_id eine Variable oder zum Beispiel 101 einträgt?

In dem angehangen Code funktioniert der Import der csv-Datei, nur weiß ich halt nicht wie ich es zuordne. Die csv-Datei würde so aussehen in meinem Versuch:

1,2
3,3

Code: Alles auswählen

with open('test.csv', "rt") as data:
    for row in csv.reader(data):
         if row[0] == "1":
            cursor.execute("INSERT IGNORE INTO data (sensor_id,value) VALUES(%s, %s)", row) #erstes %s falsch
Ich hätte gern das dann in der DB steht: sensor_id = 101, value = 1

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 10:22
von __deets__
Statt auf "1" zu pruefen solltest du auf "not row[0]" pruefen - denn du willst ja auch Werte anders als 1 in der DB haben, oder?

Und statt die ganze Zeile einzufuegen, musst du ein neues Tupel bauen aus Name und Wert, und das verwenden.

Code: Alles auswählen

data = ('Sensor1', row[0])

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 12:19
von Sirius3
@Camu: irgendwie fehlt bei Deinem INSERT noch das Datum; bist Du absolut sicher, dass "INSERT IGNORE" hier richtig ist?

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 13:45
von Camu
Hallo,

ja das war nur zum probieren ob es funktioniert, da die richtige Dateien meistens über 50.000 Zeilen haben. Insert Ignore war auch nur zum testen in dem Beispiel. Das Programm funktioniert, danke euch :)

Code: Alles auswählen

#Execution-Objekt erzeugen
cursor = connection.cursor()

with open('klima.csv', "rt") as data:
    for row in csv.reader(data):
        if not row[1] == "":
            data = ('101', row[0], '0', row[1])
            cursor.execute("INSERT INTO data (sensor_id, date, single_reading, value) VALUES(%s, %s, %s, %s)", data)
        if not row[2] == "":
            data = ('102', row[0], '0', row[2])
            cursor.execute("INSERT INTO data (sensor_id,date, single_reading, value) VALUES(%s, %s, %s, %s)", data)

connection.commit()

#Execution-Objekt schließen
cursor.close()

connection.close
Kann man da noch etwas verbessern?

Wenn die Zeilen vom Header zum Beispiel 5 sind, ist es dann am besten 5 x spamReader.next() zu nutzen oder gibt es da etwas besseres? Nun versuche ich mich mal noch daran das er alle Dateien aus einem Verzeichnis einliest und wenn das einlesen der Datei funktioniert hat, diese in einen anderen Ordner verschiebt.

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 14:28
von __deets__
Man schreibt nicht "not x == y".

Entweder schreibst du "x != y", oder in diesem speziellen Fall weil "" schon als falsch interpretiert wird einfach "row[0]" - da hatte ich selbst noch ein falsches not vorangestellt.

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 14:34
von Sirius3
@Camu: sind sensor_id und single_reading tatsächlich Zeichenketten in der Datenbank? Man vermeidet beim Programmieren Copy-Paste-Code:

Code: Alles auswählen

SENSOR_ID2ROW_INDEX = {
    101: 1,
    102: 2,
}
with open('klima.csv', "rt") as data:
    for row in csv.reader(data):
        for sensor_id, row_index in SENSOR_ID2ROW_INDEX.items():
            value = row[row_index]
            if value != "":
                data = (sensor_id, row[0], 0, value)
                cursor.execute("INSERT INTO data (sensor_id, date, single_reading, value) VALUES (%s, %s, %s, %s)", data)
`connection.close` sollte man auch aufrufen.

Re: CSV Modul

Verfasst: Mittwoch 27. September 2017, 15:54
von Camu
Ja die beiden Werte benötigen wir für spätere Werte. In dem Fall könnte ich aber beim erstellen der Datenbank-Tabelle Single_Reading Standardmäßig auf 1 setzen, da dies in dem Fall immer 1 sein wird. Standardmäßig ist er sonst halt 0.

Danke :)