将数据从csv导入到mariaDB缺少第一列

时间:2018-06-18 10:55:28

标签: mysql bash csv

我有一个包含4列的.csv文件。我在将第一列输入表格时遇到问题。这是脚本:

#!/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时第一列是如何丢失的,但是当我单独回显每个变量时却不知道?

编辑:我的.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

2 个答案:

答案 0 :(得分:0)

你的mysql命令应该在你的循环中:

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

OT:你不需要用分号来终止echo string中的mysql命令。

答案 1 :(得分: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 ...

在验证之前不要忘记截断您的表格,这样您就不会评估旧的(错误的)数据。 ;)