При импорте данных из csv в mariaDB отсутствует первый столбец

0

У меня есть 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
  • 0
    Насколько я вижу, вы должны поместить свою команду mysql позади вашей команды echo внутри цикла.
  • 0
    не могли бы вы добавить несколько строк вашего CSV, пожалуйста? (head -n5 Mysql-Data.csv) и обрежьте вашу таблицу, чтобы не было никаких реликтов (усекать logstash)
Показать ещё 1 комментарий
Теги:
csv

2 ответа

0

Хорошо, так он работает (тестируется локально):

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 ...

И не забудьте обрезать таблицу перед проверкой, чтобы вы не оценивали старые (неправильные) данные. ;)

0

Ваша mysql-команда должна находиться внутри вашего цикла:

while read column1 column2 column3 column4; do 
  echo "INSERT INTO ..." | mysql --user='user' --password='password' -D logstash;
done < Mysql-Data.csv

OT: вам не нужна точка с запятой, чтобы завершить команду mysql внутри эхо-строки.

  • 0
    К сожалению, это не сработало. Результат все тот же, только с большим количеством выводов на терминале.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню