Apache pig 仅当逗号(,)的内部引号(";)在Pig中时才替换逗号(,)

Apache pig 仅当逗号(,)的内部引号(";)在Pig中时才替换逗号(,),apache-pig,Apache Pig,我有这样的数据: 1,234,"john, lee", john@xyz.com 我想用pig脚本删除“”中的空格。因此,我的数据如下所示: 1,234,john lee, john@xyz.com 我尝试使用CSVExcelStorage加载此数据,但我还需要使用'-tagFile'选项,这在CSVExcelStorage中不受支持。所以我计划只使用PigStorage,然后替换引号中的任何逗号(,)。 我被困在这个问题上了。非常感谢您的帮助。谢谢下面的命令将有帮助: csvFile =

我有这样的数据:

1,234,"john, lee", john@xyz.com
我想用pig脚本删除“”中的空格。因此,我的数据如下所示:

1,234,john lee, john@xyz.com
我尝试使用CSVExcelStorage加载此数据,但我还需要使用'-tagFile'选项,这在CSVExcelStorage中不受支持。所以我计划只使用PigStorage,然后替换引号中的任何逗号(,)。
我被困在这个问题上了。非常感谢您的帮助。谢谢下面的命令将有帮助:

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,李约翰,john@xyz.com)


将其加载到单个字段中,然后使用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;
A

1,234,"john, lee", john@xyz.com
B

(1,234,)(john, lee)(, john@xyz.com)
C

(1,234,)(john lee)(, john@xyz.com)
D

(1,234,john lee, john@xyz.com)
E

(1),(234),(john lee),(john@xyz.com)

我找到了一个完美的方法。一个非常通用的解决方案如下:

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;
详细的用例可以在

上找到,实际上逗号(,)可以出现在任何字段中,并且字段计数超过30。所以我不想做concat或者替换那些你试过csv加载器很多次了吗?