Mam plik, który może zawierać od 3 do 4 kolumn wartości liczbowych oddzielonych przecinkami. Puste pola są definiowane z wyjątkiem sytuacji, gdy znajdują się na końcu wiersza:
1,2,3,4,5
1,2,3,,5
1,2,3
Poniższa tabela została utworzona w MySQL:
+ ------- + -------- + ------ + ----- + --------- + ------- + | Pole | Wpisz | Null | Klucz | Domyślnie | Extra | + ------- + -------- + ------ + ----- + --------- + ------- + | jeden | int (1) | TAK | | NULL | | | dwa | int (1) | TAK | | NULL | | | trzy | int (1) | TAK | | NULL | | | cztery | int (1) | TAK | | NULL | | | pięć | int (1) | TAK | | NULL | | + ------- + -------- + ------ + ----- + --------- + ------- +
Próbuję załadować dane za pomocą polecenia MySQL LOAD:
LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS
TERMINATED BY "," LINES TERMINATED BY "\n";
Wynikowa tabela:
+ ------ + ------ + ------- + ------ + ------ + | jeden | dwa | trzy | cztery | pięć | + ------ + ------ + ------- + ------ + ------ + | 1 | 2 | 3 | 4 | 5 | | 1 | 2 | 3 | 0 | 5 | | 1 | 2 | 3 | NULL | NULL | + ------ + ------ + ------- + ------ + ------ +
Problem polega na tym, że gdy pole jest puste w danych surowych i nie jest zdefiniowane, MySQL z jakiegoś powodu nie używa domyślnej wartości kolumny (która jest równa NULL) i używa zera. NULL jest używane poprawnie, gdy brakuje całego pola.
Niestety na tym etapie muszę umieć odróżnić NULL od 0, więc każda pomoc będzie mile widziana.
Dzięki S.
edytować
Wyjście POKAŻ OSTRZEŻENIA:
+ --------- + ------ + -------------------------------- ------------------------ + | Poziom | Kod | Wiadomość | + --------- + ------ + -------------------------------- ------------------------ + | Ostrzeżenie | 1366 | Nieprawidłowa liczba całkowita: „” dla kolumny „cztery” w wierszu 2 | | Ostrzeżenie | 1261 | Wiersz 3 nie zawiera danych dla wszystkich kolumn | | Ostrzeżenie | 1261 | Wiersz 3 nie zawiera danych dla wszystkich kolumn | + --------- + ------ + -------------------------------- ------------------------ +
mysql
csv
load-data-infile
Spiros
źródło
źródło
LOAD DATA
. Zobacz sekcję z przykładami SQL d6tstack na temat zmian schematu danych.Odpowiedzi:
To zrobi, co chcesz. Wczytuje czwarte pole do zmiennej lokalnej, a następnie ustawia rzeczywistą wartość pola na NULL, jeśli zmienna lokalna zawiera pusty ciąg:
Jeśli wszystkie są prawdopodobnie puste, wczytujesz je wszystkie do zmiennych i masz wiele instrukcji SET, na przykład:
źródło
''
gdy pobierają plik csv (używającIFNULL(Col,'')
wSELECT INTO OUTFILE
zapytaniu) dla programu Excel, ale następnie przesyłają akceptując je jako puste, zamiast zajmować się nimi\N
w pliku csv. Dzięki!0
które należy przekonwertowaćNULL
(ponieważ nie jest możliwe uzyskanie wartości zerowej dla danych, o których mowa), a także puste ciągi. Jak upewnić się, że zarówno zera, jak i puste ciągi są konwertowane naNULL
?nullif(@vone, 0)
.Podręcznik MySQL mówi:
Więc musisz zamienić puste miejsca na \ N w ten sposób:
źródło
Fields enclosed by: "
jest to, że"\N"
od"name",\N,"stuff"
\N
jest akceptowany jako oznaczającyNULL
. Zamiast tego użyjNULL
, jak w tym przykładzie:"name","age",NULL,"other","stuff"
Zachowanie jest różne w zależności od konfiguracji bazy danych. W trybie ścisłym spowodowałoby to błąd, w przeciwnym razie ostrzeżenie. Poniższe zapytanie może posłużyć do określenia konfiguracji bazy danych.
źródło
Przetwórz wstępnie wprowadzony plik CSV, aby zastąpić puste wpisy znakiem \ N.
Spróbuj na wyrażeniu regularnym: s / ,, /, \ n, / g i s /, $ /, \ N / g
Powodzenia.
źródło
(zmienna1, @ zmienna2, ..) SET zmienna2 = nullif (@ zmienna2, '' lub '') >> możesz wstawić dowolny warunek
źródło
pokaż zmienne
Show variables like "`secure_file_priv`";
Uwaga: zachowaj plik csv w lokalizacji podanej przez powyższe polecenie.
Uwaga: tutaj
date
kolumna „ ” zawiera puste wartości w pliku csv.źródło