2013-11-04 82 views
2

我有一個CSV文件,我需要格式化(即變成)SQL文件,以便接收到MySQL中。我正在尋找一種方法來將文本分隔符(單引號)添加到文本中,而不是數字,布爾值等。我發現它很困難,因爲我需要用單引號括起來的一些文本本身帶有逗號,因此難以輸入搜索和替換的逗號。下面是一個例子線我一起工作:如何在Vim中將CSV文件快速重新格式化爲SQL格式?

1239,1998-08-26,'Severe Storm(s)','Texas,Val Verde,"DEL RIO, PARKS",'No',25,"412,007.74" 

這是聯邦緊急事務管理局的數據文件,用131246行,我下車,我試圖進入一個MySQL數據庫data.gov的。正如你所看到的,我需要經過得克薩斯和Val Verde的前插入一個單引號,所以我嘗試:

s/,/','/3 

但只更換了前三行的文件的逗號的第一次出現。一旦我過去了,我將需要找到一種方法來處理「DEL RIO,PARKS」,因爲它有一個逗號,我不想單引號。

那麼,有沒有一個「好」的方法來處理這個數據從純CSV讓它正確的SQL格式?

由於

+1

MySQL具有內置的讀取CSV的功能。看看http://dev.mysql.com/doc/refman/5.1/en/load-data.html –

+0

這很不錯,但它似乎已經截斷了我的131246行文件下降到959行。 – Brian

+0

這是一個錯字,「德克薩斯州,Val Verde」沒有以結束單引號結尾嗎? –

回答

0

只是把這個結束時,我結束了使用@Eric安德烈斯的想法,這是MySQL的負荷數據選項:

LOAD DATA LOCAL INFILE '/path/to/file.csv' 
INTO TABLE MYTABLE FIELDS TERMINATED BY ',' LINES TERMINATED BY '\r\n'; 

最初的.csv文件仍然需要一些按摩,但不像我手動做的那麼多。

當我評論LOAD DATA截斷了我的文件時,我錯了。我將該文件視爲典型的.sql文件,並假定我添加的「ID」列會自動遞增。事實證明,情況並非如此。我不得不創建一個快速腳本,在每行的前面添加一個ID。之後,LOAD DATA命令適用於我的文件中的所有行。換句話說,所有的數據必須在文件中加載之前加載,否則加載將不起作用。

再次感謝所有回覆的人,以及@Eric Andres對他的想法的最終使用。

0

我會採取這樣的方法:

:%S /,\( 「[^」] * 「\ | [^,」] * \)/,「\ 1 '/克

:%S/^ \( 「[^」] * 「\ | [^,」] * \)/' \ 1' /克

在詞語,尋找一個雙引號一組字符或\ \,一個非雙引號的以逗號開頭的一組字符,並用一個單引號替換一組字符。

接下來,在一排的第一列,尋找一個雙引號字符集,或者\ |,開始了非雙引號字符集合與一個逗號和替換的字符集在一個單引號。

+0

我會試一試,謝謝。 – Brian

+0

嗯,我不完全說明這個csv中的非文本列。 –

+0

您可能想要創建數據類型特定的替換參數。 –

2

CSV文件是出了名的冒險解析。不同的程序以不同的方式導出CSV,可能包括像引用字段中嵌入新行或引用字段中引用不同方式的奇怪。你最好使用專門適用於解析CSV的工具--Perl,python,ruby和java都有CSV解析庫,或者有諸如csvtool或ffe的命令行程序。

如果您使用腳本語言的CSV庫,也可能是你能夠利用語言的SQL導入也是如此。這對於一次性來說過於誇張,但是如果您以這種方式導入大量數據,或者如果您正在轉換數據,則可能是值得的。

我想,我也希望做一些故障排除,找出原因CSV導入到MySQL失敗。

0

試試csv插件。它允許將數據轉換爲其他格式。幫助包括一個例子,如何將數據轉換導入到數據庫中