2012-10-19 44 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根據需要適應你的具體案例。