2017-11-03 16 views
1

私は以下のコードを試してみましたが、CSVファイルは8000万行(およそ25GB)を超えており、エコーコマンド。 csvには2つのカラムがカンマで区切られています。 例:Bash:Base64で非常に大きな.csvの1列をエンコードして新しいファイルに出力する

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

目標は、第二のカラムとbase64では、SQL DBにインポートする準備をしていることを取ることです。 2番目の列でbase64エンコードを行っているので、Unicodeサポートなどがあり、文字がないとdbが破損します。 私はなど特別な文字で中断されませんこれを行うには、より効率的な方法を探しています

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

もう1つの問題は、データ内にコンマが含まれている可能性があることです。 – illwill

答えて

1

問題は、引数を引用していないということですawkスクリプトではechoになります。

しかし、これにはawkを使用する必要はありません。bashは、ファイルを直接解析できます。

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、base64col2として出力するcol1、col2の出力が明確ではありませんでした。 youresはbase64'dの第2列のみを出力します – 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はこれを処理できるため、変換を避けることでディスク領域を節約できます。 MySQLのマニュアルを参照して、LOAD DATA INFILEを使用する方法の詳細については

https://dev.mysql.com/doc/refman/5.7/en/load-data.html

あなたはLOAD権限を持つユーザーとしてMySQLに認証を行う必要があり、かつlocal-infileオプションが有効になります(上の--local-infile=1を渡すことによって、例えばコマンドライン。

+0

オーバーヘッドなど入力とコンバージョンを伴う巨大なデータセットでこれがうまく動作します – illwill

+0

オーバーヘッドは、実際には非常に複雑でない限りベンチマークで計測することはほとんどできません。独自の細工された低レベルの表領域インポータを実装するのに手間がかかりますが、他のものではそれを打ち負かすことはできません。 –

関連する問題