今天創建了一個表用於存放論文數據, 可沒想到csv數據就有2GB大小.
於是就有一系列問題需要解決.
- MySQL導入csv文件.
load data local infile '/media/yida//aminder/data/papers.csv' into table paper
FIELDS
TERMINATED BY '|'
ENCLOSED BY '"'
ESCAPED BY ''
LINES TERMINATED BY '\n'
IGNORE 1 LINES
(id,title,abstract,authors,journal);
以上是向paper
表,傳入papers.csv
文件.
- Terminated by ‘|’ 表示列分隔符, 用|分隔從而區分正文.
- enclosed by 表示輸入mysql的時候, 值將被"包圍
- escaped by 表示轉義
- ignore 1 lines 表示忽略第一行(因爲第一行是文件頭)
- 處理csv文件的不合規
- 雙引號
文件存在雙引號單引號並存, 這就導致在錄入的時候, 在某些值處遇到錯誤的雙引號而使數據錄入不全.
MySQL Load data infile — double quotes in a double quoted value as “a ”double“ quoted value”
https://stackoverflow.com/questions/43229357/mysql-load-data-infile-double-quotes-in-a-double-quoted-value-as-a-double/43229853
The CSV is broken. There is no way MySQL or any program can import it. The double quotes needed to be escaped if inside a column.
You might fix the CSV with a script. If the quotes doesn’t have a comma in front or behind it, it’s probably part of the text and should be escaped.
解決方法是在文件中將雙引號全部替換掉
replace('"', '\'')
- 分隔符
原本以爲|
已經夠用了, 但是論文中的數據比較複雜, 會出現某些數學式子, 例如條件概率P(X|Y)
.
解決方法是用更加複雜的分隔符, 比如{|}
- 修改大文件上傳限制
phpmyadmin限制只能2MB, 大一點就需要用mysql的命令行輸入. 然而這還是可能遇到瓶頸. 所以需要將下面兩個參數設置大一點.
set global net_buffer_length=1000000; --Set network buffer length to a large byte number
set global max_allowed_packet=1000000000; --Set maximum allowed packet size to a large byte number
其中還以爲是sql文件太大, 探索了一下怎麼分塊文件.
文件分片上傳了. Linux自帶
split
工具
split -l 500000 papers.csv paper_
- 每個分塊文件50w行
- 分塊後的文件前綴是
paper_
, 後綴是aa
,ab
,ac
以此類推