【发布时间】:2017-09-21 14:56:38
【问题描述】:
我需要将来自 stdout (speedtest-cli) 的以下逗号分隔字符串插入 mysql db
1746,Vodafone DE,Frankfurt,2017-04-24T16:00:13.708464,292.1655728839447,267.019,119047915.27025849,12007236.796291795
列说明如下: SERVER_ID,SPONSOR,SERVER_NAME,TIMESTAMP,DISTANCE,PING,DOWNLOAD,UPLOAD
在无需将数据保存到 csv 然后将其导入 mysql 的情况下完成此操作的最佳方法是什么?
我能够将逗号分隔的数据转换为 sqlable 数据
SQL_RESULT_DATA=$(echo $RESULT_DATA | sed -e "s/,/','/g;s/^\(.*\)$/'\1'/")
但是
mysql --host=10.8.0.18 --user speedtest --password=speedtest < echo "INSERT INTO `TEST_DATA` (`SERVER_ID`, `SPONSOR`, `SERVER_NAME`, `TIMESTAMP`, `DISTANCE`, `PING`, `DOWNLOAD`, `UPLOAD`) VALUES ( $SQL_RESULT_DATA )"
失败了
-bash: TEST_DATA: command not found
-bash: SERVER_ID: command not found
-bash: SPONSOR: command not found
-bash: SERVER_NAME: command not found
-bash: TIMESTAMP: command not found
-bash: DISTANCE: command not found
-bash: PING: command not found
-bash: DOWNLOAD: command not found
-bash: UPLOAD: command not found
-bash: echo: No such file or directory
表格说明:
MySQL [speedtest]> DESCRIBE TEST_DATA
+-------------+---------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------+------+-----+---------+----------------+
| TEST_ID | int(11) | NO | PRI | NULL | auto_increment |
| SERVER_ID | int(11) | NO | | NULL | |
| SPONSOR | text | NO | | NULL | |
| SERVER_NAME | text | NO | | NULL | |
| TIMESTAMP | text | NO | | NULL | |
| DISTANCE | int(11) | NO | | NULL | |
| PING | int(11) | NO | | NULL | |
| DOWNLOAD | int(11) | NO | | NULL | |
| UPLOAD | int(11) | NO | | NULL | |
+-------------+---------+------+-----+---------+----------------+
【问题讨论】:
-
至少显示隐含mysql表的各个字段名
-
字段是否可以包含逗号,并用引号括起来以保护它?这使得在 shell 脚本中解析它变得更加困难。
-
LOAD DATA INFILE上的 MySQL 文档展示了如何使用命名管道来避免将 CSV 数据保存到真实文件中。