MySQL загружает нулевые значения из данных CSV



у меня есть файл, который может содержать от 3 до 4 столбцов числовых значений, разделенных запятыми. Пустые поля определяются, за исключением когда они находятся в конце строки:



1,2,3,4,5
1,2,3,,5
1,2,3


в MySQL была создана следующая таблица:




+-------+--------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+-------+--------+------+-----+---------+-------+
| one | int(1) | YES | | NULL | |
| two | int(1) | YES | | NULL | |
| three | int(1) | YES | | NULL | |
| four | int(1) | YES | | NULL | |
| five | int(1) | YES | | NULL | |
+-------+--------+------+-----+---------+-------+


Я пытаюсь загрузить данные с помощью команды загрузки MySQL:



LOAD DATA INFILE '/tmp/testdata.txt' INTO TABLE moo FIELDS 
TERMINATED BY "," LINES TERMINATED BY "n";


результирующая таблица:




+------+------+-------+------+------+
| one | two | three | four | five |
+------+------+-------+------+------+
| 1 | 2 | 3 | 4 | 5 |
| 1 | 2 | 3 | 0 | 5 |
| 1 | 2 | 3 | NULL | NULL |
+------+------+-------+------+------+


проблема заключается в том, что когда поле пусто в необработанных данных и не определено, MySQL по какой-то причине не использует значение по умолчанию столбцов (которое равно NULL) и использует ноль. NULL используется правильно, когда поле отсутствует все вместе.



к сожалению, я должен быть в состоянии различать NULL и 0 на этом этапе, так что любая помощь будет оценена.



спасибо
С.



edit



вывод шоу предупреждения:




+---------+------+--------------------------------------------------------+
| Level | Code | Message |
+---------+------+--------------------------------------------------------+
| Warning | 1366 | Incorrect integer value: '' for column 'four' at row 2 |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
| Warning | 1261 | Row 3 doesn't contain data for all columns |
+---------+------+--------------------------------------------------------+
515   4  

4 ответов:

это будет делать то, что вы хотите. Он считывает четвертое поле в локальную переменную, а затем устанавливает фактическое значение поля равным NULL, если локальная переменная содержит пустую строку:

LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(one, two, three, @vfour, five)
SET four = nullif(@vfour,'')
;

Если все они, возможно, пусты, то вы бы прочитали их все в переменные и имели несколько операторов SET, например:

LOAD DATA infile '/tmp/testdata.txt'
INTO TABLE moo
fields terminated BY ","
lines terminated BY "\n"
(@vone, @vtwo, @vthree, @vfour, @vfive)
SET
one = nullif(@vone,''),
two = nullif(@vtwo,''),
three = nullif(@vthree,''),
four = nullif(@vfour,'')
;

MySQL manual говорит:

при чтении данных с данными нагрузки INFILE, пустые или отсутствующие столбцы обновлено с ". Если вы хотите NULL значение в столбце, вы должны использовать \N в файле данных. Буквальное слово "NULL" также может использоваться под некоторыми обстоятельства.

поэтому вам нужно заменить пробелы на \N следующим образом:

1,2,3,4,5
1,2,3,\N,5
1,2,3

поведение отличается в зависимости от конфигурации базы данных. В строгом режиме это вызовет ошибку или предупреждение. Следующий запрос может быть использован для идентификации конфигурации базы данных.

mysql> show variables like 'sql_mode';

предварительно обработайте входной CSV, чтобы заменить пустые записи на \N.

попытка регулярного выражения: s/,,/,\n,/g и s/,$/,\N / g

удачи.

Comments

    Ничего не найдено.