staging.inyokaproject.org

mariadb Load Data Local Infile Fehler bei leeren "Zellen"

Status: Ungelöst | Ubuntu-Version: Ubuntu 19.10 (Eoan Ermine)
Antworten |

caiusjuliuscaesar

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo,

ich habe bei einem Load Data Local Infile Prozeß aus einer csv-Datei Porbleme beim Laden von numerischen Werten in leere "Zellen". Diese leeren Zellen liegen etwa so aus:

1
2
"Fleischsalat", 3.5, "mit Benzol"
"Noch nichts",,"auch noch nichts"

Obwohl die Preisspalte mit NULL definiert wurde, erhalte ich die Fehlermeldung

1
ERROR 1292 (22007) at line 5: Incorrect double value: '' for column soundso

Kann mann mariadb dazu bringen, leere "Zellen" beim Load Data Local Infile zu igniorieren bzw. mit einem DEFAULT-Wert zu füllen?

Gruß und danke CJC

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Da ich gerade etwas faul bin, werfe ich hier als Muster mal ein SQL-Skript rein, das ich verwendet habe, um eine Datei im JSON streaming-Format einzulesen. Dein Problem ist im Grund das gleiche, wie ich es hatte: MySQL prüft die Zeichenkette nicht darauf, ob sie einen Wert enthält, der zumindest semantisch auf den Datentyp der Zielspalte abgebildet werden kann.

Meine Lösung sieht dann so aus, dass ich entsprechende Vergleichstests mit den Zeichenkettenwerten mache und abhängig davon dann den richtig typisierten Wert einfüge. Dazu habe ich im Skript die Spalten, wo es zu Fehlern kam, den Spaltennamen mit @-Zeichen als Platzhalter markiert und eben mit dem SET rumgespielt.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
LOAD DATA INFILE 'infile'
IGNORE INTO TABLE projects
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
IGNORE 1 ROWS
(
  id, photo, name, blurb, goal, pledged, state, slug, @disable_communication, country, currency, currency_symbol,
  @currency_trailing_symbol, deadline, state_changed_at, created_at, launched_at, @staff_pick, backers_count,
  static_usd_rate, usd_pledged, @creator, @location, @category, @profile, @spotlight, @urls, source_url, friends,
  @is_starred, @is_backing, permissions
)
SET disable_communication = (@disable_communication = 'true'),
    currency_trailing_symbol = (@currency_trailing_symbol = 'true'),
    staff_pick = (@staff_pick = 'true'),
    creator = IF(JSON_VALID(@creator), @creator, null),
    location = IF(JSON_VALID(@location), @location, null),
    category = IF(JSON_VALID(@category), @category, null),
    profile = IF(JSON_VALID(@profile), @profile, null),
    spotlight = (@spotlight = 'true'),
    urls = IF(JSON_VALID(@urls), @urls, null),
    is_starred = (@is_starred = 'true'),
    is_backing = (@is_backing = 'true');

Wenn ich mir dein Beispiel ansehe, ergeben die Spalten Bezeichnung, Preis, Bemerkungen einen Sinn. Ich könnte mir vorstellen, dass folgendes dazu passt:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
LOAD DATA INFILE 'infile'
IGNORE INTO TABLE preis
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
-- IGNORE 1 ROWS -- falls erste Zeile im CSV eine Kopfzeile enthält, die ersten Kommentarzeichen entfernen.
(
  bezeichnung, @preis, bemerkung
)
SET
  preis = IF(STRCMP(@preis,''), null, @preis
;

caiusjuliuscaesar

(Themenstarter)

Anmeldungsdatum:
20. Januar 2009

Beiträge: 307

Hallo Cranvil, hallo an alle,

vielen Dank. Ich habe Deine ifs teiweise eingefügt. Leider hat die Sache immer noch den Nachteil, daß man alle Fehler abfangen explizit muß. Deswegen habe ich einen teiweise anderen Weg gewählt: ich importiere die Spalten zunächst als VARCHAR und kopiere dann aus einer Tabelle in eine andere Tabelle um, und überlasse mysql die Umformatierung. Das scheint jetzt zu funktionieren.

Vielen Dank,

CJC

Cranvil

Anmeldungsdatum:
9. März 2019

Beiträge: 990

Wenn du konkrete Beispiele und Meldungen mitgeben würdest, könnten wir das ggf. auch noch ordentlich lösen - so ein bisschen als Zugabe für die Leute, die hier via Suchmaschine reinstolpern. ☺

Wenn das Thema für dich gelöst ist, dann vergiss nicht die entsprechende Markierung. Grüne Haken haben so was beruhigendes. 😀

Antworten |