5

我正在使用 awk 在标准输出中生成 csv。有没有办法直接在 mysql 中导入该内容而不将其放入文件中?

4

5 回答 5

12

正如@xdazz 的回答所说,只需使用LOAD DATA LOCAL INFILE. 我认为它是出于无知或懒惰而被否决的。快速阅读 MySQL 手册将表明这是一个完全可行的答案。

在 2016 年,对于与大多数用户最相关的 MariaDB,您可以这样做:

bash awk '{ /* My script that spits out a CSV */ }' | mysql --local-infile=1 -u user -ppassword mydatabase -e "LOAD DATA LOCAL INFILE '/dev/stdin' INTO TABLE mytable FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"';"

显然,请务必阅读手册并根据需要将选项更改LOAD DATA INFILE为适合您的具体情况。

于 2016-08-12T16:38:52.843 回答
4

MySQL 支持通过如下所示的扩展插入获取数据:

insert into table (col1, col2, col3) values
(a,b,c),
(d,e,f),
(g,h,i);

因此,您可以修改 CSV 以包含左括号、右括号和逗号,并在其前面加上insert into table...分号,然后您可以将其直接通过管道传输到 MySQL 命令行。

您还可以使用命名管道(一种 Unix 构造)将 TSV(制表符分隔,而不是逗号分隔)通过管道传输到load data infile如下所示:

mkfifo /tmp/mysqltsv
cat file.csv | sed -e 's/,/\t/g' > /tmp/mysqltsv
mysql -e "load data infile '/tmp/mysqltsv' into table tblname"

那是伪代码。您需要在一个进程中运行 cat 并在另一个进程中运行 mysql 命令。最简单的是使用两个不同的终端。更高级的是后台cat|sed

于 2014-12-23T19:01:24.493 回答
1

您似乎无法直接从标准输入导入 CSV。您必须将其保存到文件中,以便 mysql 使用其名称作为表的名称(不带扩展名),您可以使用 mysqlimport 如下:

mysqlimport -uUSER -pPASS DB FILE

于 2013-01-28T11:55:02.357 回答
0

@xdazz 比我快,但我会考虑将结果放入文件中。为什么?因为这样,如果出现问题,您可以检查并追溯问题。如果您遇到间歇性问题,这将非常有帮助,这并不总是会发生。当然,为了节省磁盘空间,导入完成后,我会将它们压缩起来,以免消耗太多。

于 2012-10-19T06:45:15.960 回答
-3

是的,只需使用管道。

$ your_command | mysql -u 用户 -p

对不起,这个答案还不够。您不能将 csv 直接输出到 mysql。您必须做额外的工作才能使结果成为有效的 sql。

load data infile或者,您可以考虑使用支持将 csv 文件加载到数据库的mysql 原生语法。

于 2012-10-19T06:41:59.320 回答