Невозможно импортировать данные с разделителями табуляции с пустыми значениями в таблицу mysql - PullRequest
0 голосов
/ 21 января 2020

У меня есть файл данных с разделителями табуляции со многими пропущенными значениями, и мне нужно импортировать его в таблицу в mariadb (10.4.5).

Я использовал эту команду:

load data infile 'c:/path to file/file.txt' into table table_name fields terminated by '\t' lines terminated by '\n' ignore 1 rows;

Но я получаю эту ошибку:

SQL Ошибка (1366): неверное двойное значение: '' для столбец db_name. table_name. col_name1 в строке 10

Когда я проверяю файл текстовых данных, col_name1 в строке 10 является отсутствующим значением - ie. ничего между двумя разделителями табуляции.

Я потратил часы, пытаясь решить эту проблему, - я был бы признателен за любую помощь: есть ли способ данных, включая импорт пропущенных значений (пустых строк) в таблицу mysql ?

Нужно ли предварительно обрабатывать текстовый файл перед использованием LOAD DATA INFILE? И если это так, что будет лучшим способом предварительной обработки?

1 Ответ

0 голосов
/ 21 января 2020

Нужно ли предварительно обрабатывать текстовый файл перед использованием LOAD DATA INFILE? И если да, то какой будет лучший способ предварительной обработки?

Вы должны сделать это во время импорта. Примерно так:

LOAD DATA INFILE 'c:/path to file/file.txt' 
INTO TABLE table_name 
FIELDS TERMINATED BY '\t' 
LINES TERMINATED BY '\n' 
IGNORE 1 ROWS
-- the fields which values are set directly, 
-- and intermediate variables for values which must be processed,
-- positioned according to CSV structure
(field1, field2, @variable3, field4, ...)
-- process the values in the variables and set fields values
SET field3 = CASE WHEN @variable3 = '' THEN 0 ELSE @variable3 END;

(field1, field2, @variable3, field4, ...) - это место назначения полей данных, проанализированных из каждой строки исходного файла CSV.

Т.е. первое проанализированное значение из исходной строки, которая обрабатывается в данный момент, будет присвоено непосредственно полю field1 таблицы назначения. То же самое со вторым значением и field2.

Третье проанализированное значение будет присвоено пользовательской локальной переменной @variable3.

Четвертое проанализированное значение снова будет назначено таблице поле. И так далее, если присутствует больше данных и кода.

После того, как вся строка проанализирована в соответствии со спецификацией, описанной выше, выполняется следующая директива обработки: SET field3 = CASE WHEN @variable3 = '' THEN 0 ELSE @variable3 END.

Это просто. Если значение переменной @variable3 было присвоено пустой строке, то значение 0 присваивается полю field3 анализируемой записи, в противном случае значение, проанализированное из текущей строки исходного файла, присваивается этому полю без модификация.

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

После сохранения записи следующая строка из CSV читается, анализируется, обрабатывается, сохраняется, затем следующая строка ... и т. Д. До конца файла или какой-либо ошибки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...