Bash:Base64在非常大的.csv中编码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
的问题是,你不报价参数到awk
脚本中的echo
。
但是没有必要为此使用awk
,bash
可以直接解析文件。
IFS=, while read -r col1 col2
do
base64=$(base64 <<<"$col2")
echo "$col1, $base64"
done <input.csv> base64.csv
The goal is to take that second column and base64
随着awk
getline
功能:
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=
我不清楚输出是col1,col2要输出为col1,base64col2。 youres只输出base64的第二列 – illwill
@illwill,看我的更新 – RomanPerekhrest
尝试这样的事情在你的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
命令行。
这对于输入和转换尽可能多的开销等大数据集有多大作用 – illwill
开销大约是尽可能低,你可能没有用C编写自己定制的输入转换器。实际上,除非它非常复杂,否则几乎无法在基准测试中进行测量。在实现自己定制的低级别表空间导入器时,您无法用其他任何东西来打败它。 –
另一个问题,我发现是第二列可能包含数据中的逗号。无论如何解决? – illwill