У меня есть CSV файл с 4 столбцами. У меня возникли проблемы с вводом первого столбца в таблицу. Вот сценарий:
#!/bin/bash
_csvfile="/logstash/Mysql-Data.csv"
#Create the tables if they dont exists
mysql -u user -ppassword logstash << eof
CREATE TABLE IF NOT EXISTS \'elkDevIndexAssoc\' (
cenDevSID varchar(255),
cenDevFQDN varchar(255),
cenDevIP varchar(255),
cenDevServiceName varchar(255)
)
eof
#Format the csv, replace ";" with ","
sed -i -e 's/;/,/g' $_csvfile
#sed -i -e 's/^/,/g' $_csvfile
IFS=,
while read column1 column2 column3 column4
do
echo "INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('$column1', '$column2', '$column3', '$column4');"
done < Mysql-Data.csv | mysql --user='user' --password='password' -D logstash;
Выход выглядит нормально, если я повторяю каждую переменную столбца, например $ column1 - 4. Например:
123213 serverfqdn 127.0.0.1 mysql
Но когда я попытаюсь импортировать его в mysql, первый столбец отсутствует, например:
mysql> select * from elkDevIndexAssoc;
+-----------+------------------------------------------------+---------------- -+--------------------+
| column1 | column2 | column3 | column4 |
+-----------+------------------------------------------------+---------------- -+--------------------+
|column1 | column2 | column3 | column4
| | serverfqdn | 127.0.0.1 | mysql
Я не понимаю, как первый столбец отсутствует, когда я импортирую его в mysql, но не когда я повторяю каждую переменную отдельно?
EDIT: Мой. CSV файл отформатирован следующим образом:
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service
S123123,serverfqdn,127.0.0.1,service
Хорошо, так он работает (тестируется локально):
IFS=,
while read column1 column2 column3 column4; do
echo "INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('$column1', '$column2', '$column3', '$column4')"
done < <(sed 's/;/,/g' < Mysql-Data.csv)
sed
не изменяет ваш файл csv, но ваш цикл читается. В моем примере входной циклы поступает из - за done
. Позаботьтесь о IFS=,
это повлияет на весь оставшийся ваш скрипт, поэтому было бы лучше ограничить его командой sed
(так или иначе).
Приведенный выше сценарий расширяет ваши данные до:
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
INSERT INTO elkDevIndexAssoc (cenDevSID,cenDevFQDN,cenDevIP,cenDevServiceName) VALUES ('S123123', 'serverfqdn', '127.0.0.1', 'service')
Выполните этот вывод команды echo внутри цикла на ваш mysql:
while ...
echo "..." | mysql -u... -p...
done ...
И не забудьте обрезать таблицу перед проверкой, чтобы вы не оценивали старые (неправильные) данные. ;)
Ваша mysql-команда должна находиться внутри вашего цикла:
while read column1 column2 column3 column4; do
echo "INSERT INTO ..." | mysql --user='user' --password='password' -D logstash;
done < Mysql-Data.csv
OT: вам не нужна точка с запятой, чтобы завершить команду mysql внутри эхо-строки.