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
CSV Modul
- noisefloor
- User
- Beiträge: 4209
- Registriert: Mittwoch 17. Oktober 2007, 21:40
- Wohnort: WW
- Kontaktdaten:
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
Ich hätte gern das dann in der DB steht: sensor_id = 101, value = 1
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
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.
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])
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
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.
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
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.
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.
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.
@Camu: sind sensor_id und single_reading tatsächlich Zeichenketten in der Datenbank? Man vermeidet beim Programmieren Copy-Paste-Code:
`connection.close` sollte man auch aufrufen.
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)
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
Danke
