Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
从stdin导入MySQL_Mysql_Bash_Awk - Fatal编程技术网

从stdin导入MySQL

从stdin导入MySQL,mysql,bash,awk,Mysql,Bash,Awk,我正在使用awk在标准输出中生成csv。 有没有一种方法可以直接在mysql中导入这些内容而不将其放入文件?是的,只需使用管道即可 $your|u命令| mysql-u user-p 对不起,这个答案还不够。您不能将csv直接输出到mysql。 您必须做额外的工作才能使结果成为有效的sql 或,您可以考虑使用mysql原生代码>加载数据-< /COD>语法,它支持将CSV文件加载到数据库。@ DAZZZ比我快,但我会考虑将结果放到文件中。为什么?因为这样,如果出现问题,你可以检查并追踪问题。如果

我正在使用awk在标准输出中生成csv。 有没有一种方法可以直接在mysql中导入这些内容而不将其放入文件?

是的,只需使用管道即可

$your|u命令| mysql-u user-p

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


或,您可以考虑使用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的声誉,除非他们没有正确阅读问题,犯了一个诚实的错误。”。也许是时候编辑这个答案了?这里我们有一个最接近正确答案的东西,零投票。