2017-07-10 2 views
1

に動作しません。 私は豚に正規表現を適用しようとしているが、それはREGEX_EXTRACT私は初め、各フィールドの終わりから二重引用符を「"」削除したい

入力を動作しないようですよ:

(main_170521230001.csv,"9","2017-05-21 23:00:01.472636") 
(main_170521230001.csv,"91","2017-05-21 23:00:01.472636") 
(main_170521230001.csv,"592","2017-05-21 23:00:01.472636") 

豚スクリプト:

raw = LOAD '/data/csv' using PigStorage(',','-tagFile') as (
    fn:chararray, 
    gid:chararray, 
    createdts:chararray); 

res = foreach raw generate 
     REGEX_EXTRACT(fn, '([^"](.*)[^"])',1) as (fn:chararray), 
     REGEX_EXTRACT(gid, '([^"](.*)[^"])',1) as (gid:chararray), 
     REGEX_EXTRACT(createdts, '([^"](.*)[^"])',1) as (createdts:chararray); 

dump res; 

出力:

(ain_170521230001.cs,,017-05-21 23:00:01.47263) 
(ain_170521230001.cs,91,017-05-21 23:00:01.47263) 
(ain_170521230001.cs,592,017-05-21 23:00:01.47263) 

私は予想:

(main_170521230001.csv,9,2017-05-21 23:00:01.472636) 
(main_170521230001.csv,91,2017-05-21 23:00:01.472636) 
(main_170521230001.csv,592,2017-05-21 23:00:01.472636) 

は、私は "" との間のすべての文字を受信したいです。 例:

"abc" -> abc 
abc -> abc 
""abc""" -> abc 
"a"b"c" -> a"b"c 

厥なぜ私はこのパターンを使用しています:

'([^"](.*)[^"])' 

をそれが一つの場合を除いて、正常に動作します - 二重引用符の間に単一の文字がある場合、このパターンは、空の文字列 理由を返します。それはそうなるのですか?

+1

REPLACEを試しましたか? – philantrovert

答えて

0

データを1つのフィールドにロードし、REPLACEを使用します。次に、STRSPLITを使用して個々のフィールドを取得します。

raw = LOAD '/data/csv' USING TextLoader(); 
res = foreach raw generate REPLACE($0,"\\"",''); 
res_new = foreach res generate STRSPLIT($0,',',3); 
dump res_new; 
関連する問題