2017-11-03 109 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编写自己定制的输入转换器。实际上,除非它非常复杂,否则几乎无法在基准测试中进行测量。在实现自己定制的低级别表空间导入器时,您无法用其他任何东西来打败它。 –