У меня есть 3000 csv файлов, которые "разделены и разделены. Каждый из них назван после того, как сервер собрал данные. Мне нужно импортировать их в базу данных, чтобы я мог работать с данными.
Для отдельного файла, который я пробовал:
mysql -uuser -ppassword --local-infile mydatabase -e "LOAD DATA LOCAL INFILE '/root/downloads/test/reports/mytestcsvfile.csv' INTO TABLE results FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES FIELDS FIELDS ESCAPED BY '\' "
и это отлично работает, за исключением того, что каждый элемент данных заключен в кавычки. Если я добавлю
ENCLOSED BY '"'
то "в этом параметре останавливает импорт и просто дает мне подсказку>.
Если я уйду с
ENCLOSED BY '\"'
то я получаю сообщение об ошибке:
ERROR 1064 (42000) at line 1: You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'FIELDS ENCLOSED BY '"' FIELDS ESCAPED BY '\'' at line 1
Мне нужно приложить все это в нечто вроде:
#!/bin/bash
FILES= /root/downloads/smtptest/reports/
for f in $FILES
do
echo "processing $f..."
mysql -uuser -ppassword --local-infile mydatabase -e "LOAD DATA LOCAL INFILE '/root/downloads/test/reports/$f' INTO TABLE results FIELDS TERMINATED BY ',' LINES TERMINATED BY '\n' IGNORE 1 LINES FIELDS FIELDS ESCAPED BY '\' "
done
Как я могу запустить импорт и удалить ". Mysqlimport выглядит исключенным, поскольку он импортирует в таблицу на основе имени файла, а не что-то, что я хочу.
А также...
Чтобы разрешить мне запускать его для каждого файла, в настоящий момент мне нужно запустить это в первую очередь:
for f in file*.csv; do echo ":" $f ":"; sed -i "s/^/\"$f\",/" "$f"; done
Это добавляет каждое имя сервера (имя файла) к началу каждой строки в каждом файле, чтобы это стало частью записи в базе данных. Есть ли более элегантный способ сделать это?
Я нашел проблему: я использовал несколько полей, чтобы определить вложенные, завершенные и экранированные по параметрам. Когда я удалил, все началось
Это сработало:
!/bin/bash
for filename in /root/downloads/smtptest/reportsmod/*.csv; do
echo "processing $filename"
mysql -uuser -ppassword --local-infile smtpsslcheck -e "LOAD DATA LOCAL INFILE '$filename' INTO TABLE results FIELDS TERMINATED BY ',' ENCLOSED BY '\"' LINES TERMINATED BY '\n' IGNORE 1 LINES"
done