2012-10-19 47 views

回答

-3

是的,只需使用管道。

$ your_command | mysql -u用户-p

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

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

+6

为什么这个答案给出?它不起作用。为什么它被提高了?它不起作用。尝试一下。你会得到一个语法错误。这只有在“your_command”的输出是有效的SQL时才有效,而CSV肯定不是。 –

+1

@xdazz我惊呆了,发布这样的答案的人能够积累101k的声望,除非他们通过不正确地阅读问题而犯了一个诚实的错误。也许是时候编辑这个答案了? – toon81

0

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

1

似乎你可以直接从stdin导入CSV。 你必须让MySQL使用它的名字作为表名(不包括扩展名),将其保存到一个文件,你可以使用的mysqlimport为:

mysqlimport -uUSER -pPASS DB FILE

+0

在这里,我们有最接近正确的答案,零upvotes。 –

3

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

1

正如@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根据需要适应你的具体案例。