2017-11-03 190 views
1

我試過使用下面的代碼,但csv文件有超過8000萬行(大約25GB),並且一些特殊字符似乎中斷回聲命令。 csv有2列用逗號分隔。 例如:Bash:Base64在非常大的.csv中編碼1列,並輸出到新文件

blah, blah2 
data1,data2 
line3,fd$$#$%T%^Y%&$$B 
somedata,%^&%^&%^&^ 

的目標是採取第二列和Base64是要準備好導入到SQL數據庫。我在第二列做了base64編碼,所以有unicode支持等,沒有字符會損壞分貝。 我正在尋找這樣做的更有效的方式,不會對特殊字符等打破

awk -F "," ' 
    { 
     "echo "$2" | base64" | getline x 
     print $1, x 
    } 
' OFS=',' input.csv > base64.csv 

錯誤:

sh: 1: Syntax error: word unexpected (expecting ")") : 
not foundrf : 
not found201054 : 
not foundth : 
not foundz09 
| base64' (Too many open files)ut.csv FNR=1078) fatal: cannot open pipe `echo q1w2e3r4 
+0

另一個問題,我發現是第二列可能包含數據中的逗號。無論如何解決? – illwill

回答

1

的問題是,你不報價參數到awk腳本中的echo

但是沒有必要爲此使用awkbash可以直接解析文件。

IFS=, while read -r col1 col2 
do 
    base64=$(base64 <<<"$col2") 
    echo "$col1, $base64" 
done <input.csv> base64.csv 
+0

獲取錯誤:./base64.sh:第2行:while:命令未找到 ./ base64.sh:第3行:意外標記'do'附近的語法錯誤 ./base64.sh:第3行:'do' – illwill

+0

我想不出爲什麼它無法找到'while'命令,它是一個內置命令。 – Barmar

+0

當我搜索其他錯誤的例子時,他們總是由於某種錯字。 – Barmar

0

The goal is to take that second column and base64

隨着awkgetline功能:

awk -F',[[:space:]]*' '{ cmd="echo \042"$2"\042 | base64"; cmd | getline v; 
     close(cmd); print $1","v }' input.csv > base64.csv 

base64.csv內容(當前輸入):

blah,YmxhaDIK 
data1,ZGF0YTIK 
line3,ZmQyNzMwOCMkJVQlXlklJjI3MzA4Qgo= 
somedata,JV4mJV4mJV4mXgo= 
+0

我不清楚輸出是col1,col2要輸出爲col1,base64col2。 youres只輸出base64的第二列 – illwill

+0

@illwill,看我的更新 – RomanPerekhrest

0

嘗試這樣的事情在你的MySQL命令 - 在線客戶端:

LOAD DATA LOCAL '/tmp/filename.txt' INTO TABLE tbl FIELDS TERMINATED BY ','

如果需要,您可以重新排序字段,如果你需要刪除特殊字符,連接字符串,轉換日期格式等,如果你還是真的需要base64相互轉換時,MySQL版本5.6及更高版本適用於特殊的表達一個本地函數(TO_BASE64()),而有一箇舊的UDF。請參閱base64 encode in MySQL

但是,只要您的列沒有逗號,LOAD DATA INFILE就能夠處理它,並且您可以通過避免轉換來節省一些磁盤空間。

有關如何使用LOAD DATA INFILE的詳細信息,請參閱MySQL手冊:https://dev.mysql.com/doc/refman/5.7/en/load-data.html

您將需要爲使用LOAD權限的用戶到MySQL認證,並啓用local-infile選項(例如,通過對過往--local-infile=1命令行。

+0

這對於輸入和轉換儘可能多的開銷等大數據集有多大作用 – illwill

+0

開銷大約是儘可能低,你可能沒有用C編寫自己定製的輸入轉換器。實際上,除非它非常複雜,否則幾乎無法在基準測試中進行測量。在實現自己定製的低級別表空間導入器時,您無法用其他任何東西來打敗它。 –

相關問題