首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据从csv导入到mariaDB缺少第一列

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

Stack Overflow用户
提问于 2018-06-18 18:55:28
回答 2查看 70关注 0票数 0

我有一个包含4列的.csv文件。我在向表中输入第一列时遇到了问题。下面是脚本:

代码语言:javascript
复制
#!/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,输出看起来很好。如下所示:

代码语言:javascript
复制
123213 serverfqdn 127.0.0.1 mysql

但是当我随后尝试将其导入mysql时,第一列丢失了,如下所示:

代码语言:javascript
复制
mysql> select * from elkDevIndexAssoc;
+-----------+------------------------------------------------+----------------    -+--------------------+
| column1 | column2                                     | column3            | column4  |
+-----------+------------------------------------------------+----------------  -+--------------------+
 |column1 | column2                                     | column3         | column4
         |  | serverfqdn            | 127.0.0.1  | mysql

我不明白为什么当我将第一列导入mysql时,第一列会丢失,而当我分别回显每个变量时,却不会丢失。

编辑:我的.csv文件格式如下:

代码语言:javascript
复制
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
EN

回答 2

Stack Overflow用户

发布于 2018-06-18 19:21:39

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

代码语言:javascript
复制
while read column1 column2 column3 column4; do 
  echo "INSERT INTO ..." | mysql --user='user' --password='password' -D logstash;
done < Mysql-Data.csv

OT:您不需要在echo字符串中使用分号来终止mysql命令。

票数 0
EN

Stack Overflow用户

发布于 2018-06-18 20:46:45

好的,这样它应该可以工作(在本地测试):

代码语言:javascript
复制
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命令(以某种方式)。

上面的脚本将您的数据扩展为:

代码语言:javascript
复制
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:

代码语言:javascript
复制
while ...
  echo "..." | mysql -u... -p...
done ...

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50907901

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档