背景
今天接到一個任務,往一張 mysql 數(shù)據(jù)庫表里導入一點文本數(shù)據(jù)培他,壓縮文件在百度云上遗座,一看 2 G 大小,百度云還各種限速途蒋,直接不想下載了,項目小姐姐問遇到啥問題懊烤?我更她說宽堆,下載困難腌紧,估計當時她哭笑不得畜隶,沒辦号胚,最終還是得開工浸遗,直接拿 u盤 copy 的。
問題
廢了幾分鐘才 copy 完杜漠,解壓后 13.9G察净,掛不得她們都不知道里面裝的是啥,然而難不倒我氢卡,linux 系統(tǒng)可謂是編程利器。
檢查 csv 文件行數(shù)
wc -l filename
半天沒跑出來峡捡,等不及筑悴,直接又上了另外一個命令
head -n filename
tail -n filename
看了一下時間跨度,最終選定最后一天的數(shù)據(jù)進行導入阁吝,那就得鎖定最后一天是從第幾行開始的,一路tail -n filename 試出來了的装盯,接下來就是把這部分數(shù)據(jù)截取到新文件
tail -n filename > new_file.csv
新文件只剩 1 個 G 了甲馋,突然想起還有字符編碼的問題,我數(shù)據(jù)庫用的是 utf-8定躏,而 windows 平臺的數(shù)據(jù)一般是 GBK 格式,一波百度后找到了 iconv 命令垮抗,一行命令就解決了拗引,速度賊快,以后媽媽再也不用擔心我的字符編碼問題了
iconv -f GBK -t UTF-8 input_file -o output_file
然而開始要上傳到服務器矾削,阿里云的服務器上傳數(shù)據(jù)也是需要一點時間豁护。突然想欲间,把文件切分一下吧,分批班缎,或者開幾個線程一起上傳她渴,又一波百度达址,發(fā)現(xiàn)了 split沉唠, 按行切分或者按大小切分
split -l 1000000 filename
split -C 100M filename
然后愉快的先上傳了一個小塊到了服務器苛败,打開 mysql,找到 load data 的命令罢屈,當然一開始不會那么成功,各種問題都會出現(xiàn)
雙引號問題锄贷,默認會把雙引號當做字段內容填充鄙币,就導致非 字符類型的數(shù)據(jù)不能導入
字符問題蹂随,utf-8 還要再重新指定十嘿,即使我的數(shù)據(jù)本來就是 utf-8
字段對應問題岳锁,插入的表很多字段都只能為空
-
更奇怪的是每次只成功了一半,還發(fā)現(xiàn)了 show warnings 可以查看警告信息咳燕,最后發(fā)現(xiàn)時 access 導出數(shù)據(jù)時是使用 \t 分割行的乒躺,orz
show warnings
最后附上成功導入的腳本
LOAD DATA LOCAL INFILE "filename" INTO TABLE tablename
CHARACTER SET utf8
FIELDS TERMINATED BY ','
ENCLOSED BY """"
LINES TERMINATED BY '\r'
(COLUMN1, COLUMN2, ......);
測試成功后,將切割的數(shù)據(jù)合并
cat x* > file
再執(zhí)行命令曹货,大功告成!顶籽!
總結
敲命令還是很有成就感的,有時候要比使用某些軟件效率要高坏为,至少大多數(shù)軟件對大文件讀取都沒有做優(yōu)化镊绪,這對于經(jīng)常接觸大文件的人簡直是噩夢!蝴韭!atom 打開幾M的數(shù)據(jù)都卡,替換更卡摧找!果然使用 vim 替換功能牢硅,但是 vim 也不發(fā)操控大文件(幾個G以上),當然我們可以寫個腳本减余,可以將文件切割,逐一對文件進行操作如筛!也不是不行抒抬!