从stdin导入MySQL
我正在使用awk在标准输出中生成csv。 有没有一种方法可以直接在mysql中导入这些内容而不将其放入文件?是的,只需使用管道即可 $your|u命令| mysql-u user-p 对不起,这个答案还不够。您不能将csv直接输出到mysql。 您必须做额外的工作才能使结果成为有效的sql从stdin导入MySQL,mysql,bash,awk,Mysql,Bash,Awk,我正在使用awk在标准输出中生成csv。 有没有一种方法可以直接在mysql中导入这些内容而不将其放入文件?是的,只需使用管道即可 $your|u命令| mysql-u user-p 对不起,这个答案还不够。您不能将csv直接输出到mysql。 您必须做额外的工作才能使结果成为有效的sql 或,您可以考虑使用mysql原生代码>加载数据-< /COD>语法,它支持将CSV文件加载到数据库。@ DAZZZ比我快,但我会考虑将结果放到文件中。为什么?因为这样,如果出现问题,你可以检查并追踪问题。如果
或,您可以考虑使用mysql原生代码>加载数据-< /COD>语法,它支持将CSV文件加载到数据库。
@ DAZZZ比我快,但我会考虑将结果放到文件中。为什么?因为这样,如果出现问题,你可以检查并追踪问题。如果您遇到间歇性问题,这将非常有帮助,而这些问题并不总是发生。当然,为了保留磁盘空间,在导入完成后,我会将其压缩以避免消耗太多。
您似乎无法直接从stdin导入CSV。 您必须将其保存到文件中,以便mysql使用其名称作为表名(不带扩展名),您可以使用mysqlimport,如中所示:
mysqlimport-uUSER-pPASS数据库文件
MySQL支持通过如下所示的扩展插入获取数据:
insert into table (col1, col2, col3) values
(a,b,c),
(d,e,f),
(g,h,i);
mkfifo /tmp/mysqltsv
cat file.csv | sed -e 's/,/\t/g' > /tmp/mysqltsv
mysql -e "load data infile '/tmp/mysqltsv' into table tblname"
因此,您可以修改CSV,使其包含一个左括号、一个右括号和一个逗号,并在其前面加上insert-into-table…
和一个分号,然后您可以将其直接传输到MySQL命令行
您还可以使用命名管道(Unix构造)将TSV(以制表符分隔,而不是逗号分隔)通过管道传送到加载数据填充
,如下所示:
insert into table (col1, col2, col3) values
(a,b,c),
(d,e,f),
(g,h,i);
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
作为背景,正如@xdazz的回答所说,只需使用加载数据本地填充即可。我想这是因为无知或懒惰而被否决的。快速阅读MySQL手册会发现这是一个完全可行的答案
2016年,对于与大多数用户最相关的MariaDB,您可以这样做:
bash
awk“{/*myscript,它吐出一个CSV*/}”| mysql--local infire=1-u user-ppassword mydatabase-e“将数据本地infire'/dev/stdin'加载到以“\”结尾的表mytable字段中,也可以选择用“\”括起来;"
显然,请务必阅读手册,并根据需要将选项更改为加载数据填充
,以适合您的具体情况。为什么给出了这个答案?它不起作用。为什么要对它进行升级?它不起作用。尝试一下。您会得到语法错误。只有在“您的_命令”的输出“是有效的SQL,而CSV肯定不是。@xdazz我很惊讶有人发布了这样的答案,却能够获得101k的声誉,除非他们没有正确阅读问题,犯了一个诚实的错误。”。也许是时候编辑这个答案了?这里我们有一个最接近正确答案的东西,零投票。