Datenstruktur einer Datei ändern mit MySQL

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Datenstruktur einer Datei ändern mit MySQL

    Möchte aus einer csv Datei (3 Spalten, über 1.000.000 Zeilen) eine andere, umstrukturierte csv Datei erstellen. Hier die Struktur der ersten Datei:

    log_id------ variable ------ wert
    __________________________________________________
    1 ------ x001 ------ wert1_1
    1 ------ x002 ------ wert1_2
    1 ------ x003 ------ wert1_3
    ... ------ ..... ------ ......
    1 ------ x100 ------ wert1_100
    2 ------ x001 ------ wert2_1
    2------ x002 ------ wert2_2
    2------ x003 ------ wert3_3
    .... ------ .....------ ...........
    .... ------ ..... ------ ...........
    350 ------ x099 ------ wert350_99
    350 ------ x100 ------ wert350_100


    und so soll die zweit und umstrukturierte Datei aussehen:

    log_id------ x001 ------ x002------ .............x100
    ______________________________________________________
    1 --------- wert1_1------ wert1_2 ------ wert1_100------
    2 ------ --- wert2_1 ------ wert2_2------ wert2_100
    3 ------ --- wert3_1 ------ wert3_2------ wert3_100
    .. ------ ..... ------ ...... ------ ......
    350 ------ wert350_1 ------ wert350_2 ------ wert350_100

    In der neuen csv Datei sollen also die Variablenwerte aus der ersten csv als Spaltennamen stehen und die werte entsprechend log_id und wert als Datensatz eingefügt werden.
    Werde die csv mit PHP über fgetcsv() einlesen. Hoffe ich konnte mein Problem verständlich darlegen.
    Kann mir jemand mit dem mysql Code helfen, habe davon kaum Ahnung?

    Gruß
    mactoni
  • Und jedes Item hat diese 100 Optionen? Sicher, dass du korrekt normierst?
    Also ich würde solch einen einmaligen Job mit PHP machen - nicht mit MySQL.

    Das ginge dann in etwa so

    Quellcode

    1. $sum = array();
    2. // read
    3. foreach($file as $row) {
    4. $id = $row['log_id'];
    5. $key = $row['variable'];
    6. $val = $row['wert'];
    7. $sum[$id][$key] = $val;
    8. }
    9. // save
    10. foreach($sum as $row) {
    11. $sql = sprintf("INSERT INTO table (%s) VALUES(%s);",
    12. implode(",",array_keys($row)),
    13. implode(",",array_values($row))
    14. );
    15. mysql_query($sql);
    16. }
    Alles anzeigen
  • Hallo d0nut,
    erstmal Danke für die Antwort.
    Ein Versuch mit PHP gab es schon, leider dauert es fast 4h bis das Script fertig ist - definitiv zu lange, zumal das Script nicht einmalig ist sondern sehr oft benötigt wird um solche Daten umzustricken.
    Jedes Item hat sogar noch mehr als 100 Optionen, dieses Beispiel war nur der Versuch es besser zu verdeutlichen. Dachte mir das es mit MySQL schneller gehen müsste, oder liege ich da falsch?

    Gruß
    mactoni
  • Kann man auch direkt aus der Datenbank die benötigte Datei erstellen? Kann jetzt auch direkt mit der MySQL Datenbank arbeiten, daher ginge es schneller wenn ich direkt aus der datenbank die csv erstellen könnte. Dier Datenbank ist so aufgebaut wie die erste csv Datei.
    Wie würde hier der Code aussehen wenn ich also direkt aus der original MySQL Datenbank de zweite csv erstellen würde?
  • Hallo d0nut,

    die ursprüngliche Tabelle soll schon so bleiben wie sie ist. Dies ist nur eine Abfrage die eine csv Datei in diesem besondern Format ausgeben soll, alle anderen Abfragen stellen die Struktur nicht um.
    Wie würde den hier der MySQL Code aussehen wenn die Variablenwerte aus der Spalte 'Variable' als Spaltennamen und die Werte entsprechend mit log_id in eine .csv geschrieben werden?

    Gruß
    mactoni
  • du könntest versuchen mit GROUP_CONCAT und dem SEPARATOR auf , das CSV Format zu simulieren.

    Quellcode

    1. GROUP_CONCAT([DISTINCT] expr [,expr ...]
    2. [ORDER BY {unsigned_integer | col_name | expr}
    3. [ASC | DESC] [,col_name ...]]
    4. [SEPARATOR str_val])


    Dann musst du aber verhindern, dass Strings noch in Anführungszeichen gepackt werden. Und Eventuell klappt es gar nicht, weil MySQL die Kommata innerhalb des Spaltennamens automatisch escaped.
    Dann bleibt nur die PHP Lösung. $file ist dann eine Datenbankabfrage. Siehe PDO::fetchAll in der [wiki]Einführung in PDO[/wiki]