MySQL - Import CSV-Datei - Anpassen Wahr/Falsch + Timestamp

  • SQL

Es gibt 5 Antworten in diesem Thema. Der letzte Beitrag () ist von VaporiZed.

    MySQL - Import CSV-Datei - Anpassen Wahr/Falsch + Timestamp

    Hallo,

    ich möchte eine CSV-Datei eines externen Programms (komme leider nicht an den Code) in meine MySQL-DB schreiben. Die Daten sehen wie folgt aus:

    21.04.2023 12:46:55;1;1;Falsch;K1;KALIB;Wahr;Wahr;Falsch;Falsch;Wahr;Wahr;Wahr;Wahr;Wahr;Wahr;Wahr;Falsch;Wahr;Wahr;Falsch;Wahr;Falsch;Wahr;Wahr;Wahr;Wahr;Falsch;Falsch;Falsch;Falsch;Falsch;Wahr;Wahr;Wahr;Wahr;Falsch;Wahr;Wahr;Falsch

    Nun kommen meine beiden Probleme...
    Ich möchte statt Falsch/Wahr gerne 0/1 als Tinyint in die DB schreiben. Gibt es da einen einfachen und unkomplizierten Weg? Aktuell öffne ich mit einem kleinen Script alle Dateien und schreibe die Werte mittels "Suchen und Ersetzen" um, aber das ist natürlich Blödsinn.

    Das zweite Problem ist, dass ich den Zeitstempel als Timestamp(0) importiere, jedoch "0000-00-00 00:00:00" im MySQL erhalte. Was mache ich falsch?

    Spoiler anzeigen

    Datentypen:
    Spoiler anzeigen
    `id` INT NOT NULL AUTO_INCREMENT,
    `Zeitstempel` TIMESTAMP NULL,
    `Schicht` INT NULL,
    `Login` INT NULL,
    `OK` TINYINT NULL,
    `Model` VARCHAR(15) NULL,
    `Stueckzahl` VARCHAR(15) NULL,
    `P_lang` TINYINT NULL,
    `M_lang` TINYINT NULL,
    `P_kurz` TINYINT NULL,
    `M_kurz` TINYINT NULL,
    `P_Buchse_links` TINYINT NULL,
    `M_Buchse_links` TINYINT NULL,
    `P_Buchse_rechts` TINYINT NULL,
    `M_Buchse_rechts` TINYINT NULL,
    `P_Buchse_hinten` TINYINT NULL,
    `M_Buchse_hinten` TINYINT NULL,
    `P_Schwamm` TINYINT NULL,
    `M_Schwamm` TINYINT NULL,
    `P_Gummi_a` TINYINT NULL,
    `M_Gummi_a` TINYINT NULL,
    `P_Lager_Buchse` TINYINT NULL,
    `M_Lager_Buchse` TINYINT NULL,
    `P_Clips` TINYINT NULL,
    `M_Clips` TINYINT NULL,
    `P_Lagerachse` TINYINT NULL,
    `M_Lagerachse` TINYINT NULL,
    `P_Gummi_Feder` TINYINT NULL,
    `M_Gummi_Feder` TINYINT NULL,
    `P_Feder_gefettet` TINYINT NULL,
    `M_Feder_gefettet` TINYINT NULL,
    `P_Designkappe` TINYINT NULL,
    `M_Designkappe` TINYINT NULL,
    `P_Gummi_b` TINYINT NULL,
    `M_Gummi_b` TINYINT NULL,
    `P_Breite` TINYINT NULL,
    `M_Breite` TINYINT NULL,
    `P_Kern` TINYINT NULL,
    `M_Kern` TINYINT NULL,
    `P_Code` TINYINT NULL,
    `M_Code` TINYINT NULL,


    Import-Code:
    Spoiler anzeigen
    LOAD DATA LOCAL INFILE 'C:/ProgramData/MySQL/MySQL Server 8.0/Uploads/blabla.csv'
    INTO TABLE schema.tabelle
    FIELDS TERMINATED BY ';'
    OPTIONALLY ENCLOSED BY '\"'
    LINES TERMINATED BY '\n'
    IGNORE 3 LINES
    (Zeitstempel, Schicht, Login, OK, Model, Stueckzahl, P_lang, M_lang, P_kurz, M_kurz, P_Buchse_links, M_Buchse_links, P_Buchse_rechts, M_Buchse_rechts, P_Buchse_hinten, M_Buchse_hinten, P_Schwamm, M_Schwamm, P_Gummi_a, M_Gummi_a, P_Lager_Buchse, M_Lager_Buchse, P_Clips, M_Clips, P_Lagerachse, M_Lagerachse, P_Gummi_Feder, M_Gummi_Feder, P_Feder_gefettet, M_Feder_gefettet, P_Designkappe, M_Designkappe, P_Gummi_b, M_Gummi_b, P_Breite, M_Breite, P_Kern, M_Kern, P_Code, M_Code)
    SET ID = null



    Thema nach Erstellung von Post#5 verschoben ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ja gut, wenn Du eh ein VB.NET-Programm hast, würd ich wohl für den ersten Schritt die Datei erstmal per IO.File.ReadAllLines einlesen, per For-Each-Schleife alle Zeilen durchgehen und mit KorrigierteZeile = EineZeile.Replace("Falsch", "0").Replace("Wahr", "1") umwandeln. Ich hoffe mal, dass es keine sonstigen Texte in den Daten gibt ;)
    Das mit dem Timestamp: Tja: Find heraus, welches Format zu MySQL kompatibel ist, parse den Timestamp in ein Date und wandel es dann mit DasGeparsteDate.ToString(HierDasGewünschteFormat) um. Und am Ende entweder die Strings zur DB versuchen zu schicken oder eben notfalls in ne temporäre Datei schreiben und dann per CSV-Reader auslesen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich wollte eigentlich auf mein Script verzichten und die Dateien direkt einlesen.

    Ist es nicht möglich, bereits beim Einlesen, zu sagen, dass Wahr = 1 und Falsch = 0 ist? Das englische True / False erkennt er ja auch, nur eben das Deutsche nicht.

    Das DateTime-Problem habe ich lösen können. In dem Programm, welches die CSV ausgibt, kann man das Datumsformat auf "YYYY-MM-DD hh:mm:ss" ändern, so dass es für MySQL passt.

    Murdersquad schrieb:

    Ich wollte eigentlich auf mein Script verzichten
    Dann bist Du aber im falschen Unterforum. Denn das hier impliziert VB.NET.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    Ich hab's mal verschoben und umgetagged.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.