CSV to MySQL

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.
Antworten
joerg9
User
Beiträge: 3
Registriert: Montag 26. Mai 2014, 10:55

Hallo,

ich bin ein relativer Newbie in Python und möchte von einem CSV File Werte in eine MySQL DB schreiben.
Mein CSV File sieht wie folgt aus:

Code: Alles auswählen

# [6958] user@home:/var/www/data $ cat 2014-05-26_thing.csv
# Erst;00;01;02;03;04;05;06;07;08;09;10;11;12;13;14;15;16;17;18;19;20;21;22;23
# 2014-05-25;0;2;0;0;1;0;0;0;2;6;5;5;4;8;7;8;3;4;4;9;10;6;1;0
Wobei die erste Zeile aus einer Typangabe (Erst) und den Stunden von 00h - 23h besteht
und die zweite Zeile aus dem Datumsfeld und Werte der Stunden 00 - 23h.

Ich würde diese jedoch gerne wie folgt umwandeln und hab absolut keinen Plan wie ich hierzu vorgehen könnte.

Code: Alles auswählen

# |---- date -----|--- werte ---|
# | 2014-05-25 00 |     0        |
# | 2014-05-25 01 |     2        |
# | 2014-05-25 02 |     0        |
Bitte um Input wie ich das CSV File dementsprechend aufsplitten könnte.
Zum einlesen verwende ich das Modul csv. Python Version ist 2.7.

Danke und
LG
BlackJack

@joerg9: Wo liegt denn jetzt konkret das Problem?
joerg9
User
Beiträge: 3
Registriert: Montag 26. Mai 2014, 10:55

Hallo,

mein Problem ist eigentlich das ich keinen Weg kenne mit welchem ich das CSV umformatieren könnte auf:

Code: Alles auswählen

2014-05-25 00:00;0
2014-05-25 01:00;2
2014-05-25 02:00;0
2014-05-25 03:00;0
2014-05-25 04:00;1
2014-05-25 05:00;0
2014-05-25 06:00;0
2014-05-25 07:00;0
2014-05-25 08:00;2
2014-05-25 09:00;6
usw.

LG Jörg
BlackJack

@joerg9: Hast Du schon ein Grundlagentutorial durchgearbeitet?
joerg9
User
Beiträge: 3
Registriert: Montag 26. Mai 2014, 10:55

@BlackJack - ja hab ich
bfm
User
Beiträge: 88
Registriert: Donnerstag 14. März 2013, 09:42

Hi

hier mal ein Link zur Doku Version 2.7
https://docs.python.org/2.7/library/csv.html

Ein Beispiel daraus:

Code: Alles auswählen

import csv
with open('passwd', 'rb') as f:
    reader = csv.reader(f, delimiter=':', quoting=csv.QUOTE_NONE)
    for row in reader:
        print row
Wenn du die Datei einliest, dann bekommst ein Objekt "reader" zurück, das dann die Daten enthält. Da musst dann halt mal schauen, wie da jede Zeile aussieht. Dann musst irgendwie versuchen, die einzelnen "Spalten" in der Zeile auseinander zu klamüsern. Da halt jede Zeile anders aussieht, wird es wohl etwas kniffliger :-)
BlackJack

@joerg9: Dann bleibt die Frage wo denn ganz konkret das Problem liegt? Sowohl das Eingabe als auch das Ausgabeformat sind doch ziemlich einfach aufgebaut. Das jetzt in ein paar Schritten zu transformieren sollte mit grundlegenden Operationen nicht schwer sein.
Benutzeravatar
ngulam
User
Beiträge: 35
Registriert: Freitag 18. Oktober 2013, 11:03

joerg9 hat geschrieben:möchte von einem CSV File Werte in eine MySQL DB schreiben.
Dafür würde ich einfach natives SQL nehmen - warum ein Python darum herum schreiben?
งูหลาม
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

ngulam hat geschrieben:Dafür würde ich einfach natives SQL nehmen - warum ein Python darum herum schreiben?
Das wird in diesem Fall daran liegen, dass man eine einzelne Zeile der Ausgangsdatei noch einmal aufteilen muss.
BlackJack

Nicht nur aufteilen, sondern das Datum aus der zweiten Zeile auch noch mit den Stundenangaben aus der ersten Zeile zusammenbringen.

Code: Alles auswählen

#!/usr/bin/env python
from __future__ import print_function
import csv
from datetime import datetime as DateTime, timedelta as TimeDelta
from future_builtins import zip


def read_thing_csv(filename):
    with open(filename, 'rb') as lines:
        reader = csv.reader(lines, delimiter=';')
        hours_iterator = iter(next(reader))
        values_iterator = iter(next(reader))
    date = DateTime.strptime(next(values_iterator), '%Y-%m-%d')
    name = next(hours_iterator)
    return (
        name,
        (
            (date + TimeDelta(hours=int(hour)), int(value))
            for hour, value in zip(hours_iterator, values_iterator)
        )
    )


def main():
    name, date2value_iterator = read_thing_csv('test.csv')
    print(name)
    for date, value in date2value_iterator:
        print(date, value)


if __name__ == '__main__':
    main()
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

BlackJack hat geschrieben:Nicht nur aufteilen, sondern das Datum aus der zweiten Zeile auch noch mit den Stundenangaben aus der ersten Zeile zusammenbringen.
Wenn man das Format als gegeben und fix annimmt, dann reicht auch ein enumerate bei den Folgezeilen.
Antworten