2017-07-20 1 views
0

に:は、「私はこのようなデータを持っている豚

1,234,"john, lee", [email protected] 

私は、内部削除するだけで、その内部に引用符(」)「場合はカンマ(、)を交換するスペースは豚のスクリプトを使用して」。私のデータは次のようになりますように:

1,234,john lee, [email protected] 

私はこのデータをロードするCSVExcelStorageを使用してみましたが、私はCSVExcelStorageでサポートされていないだけでなくとして「-tagFile」オプションを使用する必要があります。だから、私はPigStorageだけを使用して、引用符の中にカンマ(、)を置き換えようとしています。 私はこれに固執しています。どんな助けも高く評価されます。おかげコマンド以下

答えて

0

私はこれを行うのに最適な方法を得ました。非常に一般的な解決策は以下の通りです:

data = LOAD 'data.csv' using PigStorage(',','-tagFile') AS (filename:chararray, record:chararray); 

/*replace comma(,) if it appears in column content*/ 
replaceComma = FOREACH data GENERATE filename, REPLACE (record, ',(?!(([^\\"]*\\"){2})*[^\\"]*$)', ''); 

/*replace the quotes("") which is present around the column if it have comma(,) as its a csv file feature*/ 
replaceQuotes = FOREACH replaceComma GENERATE filename, REPLACE ($4,'"','') as record; 

詳細なユースケースは

1

が役立ちます。

csvFile = load '/path/to/file' using PigStorage(','); 
result = foreach csvFile generate $0 as (field1:chararray),$1 as (field2:chararray),CONCAT(REPLACE($2, '\\"', '') , REPLACE($3, '\\"', '')) as field3,$4 as (field4:chararray); 

を出力リレー:

(1234、ジョン・リー・、[email protected]

+0

実際にはカンマ(、)任意のフィールドで発生し、フィールド数が30以上はので、私はしたくないですできmy blogでご利用いただけますconcatを行うか、それらの多くの時間を交換する – OneUser

+0

あなたはcsvローダーを試してみましたか?http://pig.apache.org/docs/r0.9.1/api/org/apache/pig/piggybank/storage/CSVLoader.html – TKHN

0

は、単一のフィールドにそれをロードし、 STRSPLITとREPLACEを使用してください。

A = LOAD 'data.csv' USING TextLoader() AS (line:chararray); 
B = FOREACH A GENERATE STRSPLIT(line,'\\"',3); 
C = FOREACH B GENERATE REPLACE($1,',',''); 
D = FOREACH C GENERATE CONCAT(CONCAT($0,$1),$2); -- You can further use STRSPLIT to get individual fields or just CONCAT 
E = FOREACH D GENERATE STRSPLIT(D.$0,',',4); 
DUMP E; 

1,234,"john, lee", [email protected] 

B

(1,234,)(john, lee)(, [email protected]) 

C

(1,234,)(john lee)(, [email protected]) 

D

(1,234,john lee, [email protected]) 

E

(1),(234),(john lee),([email protected]) 
関連する問題