#mysql #excel #macos #csv
#mysql #преуспеть #macos #csv
Вопрос:
У меня есть csv-файл с разделителем ‘;’. Это выглядит следующим образом (третий столбец должен быть пустым):
id;theme_name;description
5cbde2fe-b70a-5245-bbde-c2504a4bced1;DevTools;allow web developers to test and debug their code. They are different from website builders and integrated development environments (IDEs) in that they do not assist in the direct creation of a webpage, rather they are tools used for testing the user interface of a website or web application.
c8bfc406-aaa6-5cf9-94c3-09fc54b934e7;AI;
Вот мой скрипт для вставки данных из csv в БД:
mysql -u ${MYSQL_USER} --password=${MYSQL_PASSWORD} ${MYSQL_DATABASE} --local-infile=1 -h ${MYSQL_HOST} -e"LOAD DATA LOCAL INFILE '/tmp/init_data/$file' INTO TABLE $table_name FIELDS TERMINATED BY ';' OPTIONALLY ENCLOSED BY '"' IGNORE 1 LINES";
Когда я делаю оператор SELECT, я получаю возврат каретки ( r) в последнем столбце в ответ:
Вот ответ от mysql
{
"themeName": "DevTools",
"description": "allow web developers to test and debug their code. They are different from website builders and integrated development environments (IDEs) in that they do not assist in the direct creation of a webpage, rather they are tools used for testing the user interface of a website or web application.r"
}, {
"themeName": "AI",
"description": "r"
}
Когда я добавляю разделитель ‘;’ после последнего столбца в csv-файле, возврат каретки исчез из ответа.
например: c8bfc406-aaa6-5cf9-94c3-09fc54b934e7;AI;;
Почему mysql добавляет r в третий столбец?
Есть ли какой — нибудь возможный способ решить эту проблему? (за исключением замены в инструкции select)
Спасибо
Комментарии:
1. Ваша вторая строка в CSV-файле не содержит одинаковых (3) столбцов. Эта функциональность зависит от того, какие строки в вашем файле соответствуют правилам. Если все строки имеют разный формат, вам придется написать некоторый код с соответствующим интеллектом для загрузки базы данных
2. @RiggsFolly Я удалил все строки с двумя столбцами в csv, и это то же самое. На мой взгляд, когда mysql вставляет строки в БД из scv и если он не видит разделитель в последнем столбце, он принимает его как новую строку (возврат каретки) и добавляет ее.
3. Не совсем, в этих строках будет новая строка, либо
rn
илиr
в зависимости от того, где был создан файл (Windows или *nix) Это то, что подбирается4. Существует ли тег SO для линейных терминаторов?
Ответ №1:
Бьюсь об заклад, ваш CSV-файл поступает из Windows. Эти файлы rn
находятся в конце каждой строки.
Добавьте это в свою команду …
LINES TERMINATED BY '\r\n'
и все должно работать. Если они не попробуют это
LINES TERMINATED BY 'rn'
В системах, производных от UNIX (например, Linux) LINES TERMINATED BY 'n'
, работает по умолчанию.
В системах Mac вам нужно LINES TERMINATED BY 'r'
.
Если вы добавите конечный ;
разделитель столбцов, вы создадите четвертый столбец в вашем CSV. Но таблица, которую вы загружаете, содержит только три столбца, поэтому LOAD DATA INFILE
игнорирует четвертый столбец, в котором есть a r
.
Почему эта разница, спросите вы? Устаревшим телетайпным устройствам (оригинальным терминалам для MS-DOS и UNIX) требовался Returnкод для перемещения печатающей головки обратно в первый столбец и Newlineкод для перемещения бумаги на одну строку вверх. Команда UNIX Bell Labs решила, что их драйвер tty добавит дополнительный Returnкод, чтобы строки заканчивались определенным одиночным символом. Команда MS-DOS (ммм, Билл Гейтс) оставила их обоих.
Почему Mac с justReturn? Может быть, кто-нибудь знает.
Комментарии:
1. Спасибо за ответ! Я использую macOS. Я создал файл csv с помощью Excel для MAC. Я играю со СТРОКАМИ, ЗАКАНЧИВАЮЩИМИСЯ, но это не работает. Когда я нажимаю на API через postman, я все равно получаю возврат каретки в ответ.
2. Пока это не работает. Продолжайте пытаться. Этот материал с завершением строки — пресловутая боль в * ss.
Ответ №2:
Ответ:
По словам @O.Джонс ответ Мне нужно было добавить LINES TERMINATED BY 'r'
, но также мне нужно добавить n
mysql -u ${MYSQL_USER} --password=${MYSQL_PASSWORD} ${MYSQL_DATABASE} --local-infile=1 -h ${MYSQL_HOST} -e"LOAD DATA LOCAL INFILE '/tmp/init_data/$file' INTO TABLE $table_name FIELDS TERMINATED BY ';' ENCLOSED BY '"' LINES TERMINATED BY 'rn' IGNORE 1 LINES";