仅当它在 Pig 中的内部引号(“”)时才替换逗号(,)

Posted

技术标签:

【中文标题】仅当它在 Pig 中的内部引号(“”)时才替换逗号(,)【英文标题】:replace comma(,) only if its inside quotes("") in Pig 【发布时间】:2017-07-20 09:10:31 【问题描述】:

我有这样的数据:

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

我想使用 pig 脚本删除 "" 内的空格。这样我的数据将如下所示:

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

我尝试使用 CSVExcelStorage 加载此数据,但我还需要使用 CSVExcelStorage 不支持的“-tagFile”选项。所以我打算只使用 PigStorage,然后替换引号内的任何逗号 (,)。 我坚持这一点。非常感谢任何帮助。谢谢

【问题讨论】:

【参考方案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);

输出:

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

【讨论】:

其实 comma(,) 可以出现在任何字段中,并且字段数超过 30。所以我不想多次进行 concat 或替换 你试过 csv loader 吗?pig.apache.org/docs/r0.9.1/api/org/apache/pig/piggybank/storage/…【参考方案2】:

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

【讨论】:

【参考方案3】:

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

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;

详细用例可在my blog获取

【讨论】:

以上是关于仅当它在 Pig 中的内部引号(“”)时才替换逗号(,)的主要内容,如果未能解决你的问题,请参考以下文章

仅当它在 AngularJs 中有值时才需要下拉

添加 www 的 htaccess 条件。仅当它在 url 中不包含字符串时才到 url

仅当它是数组中的值时才可以打印数字吗? (Java)[重复]

仅当它不存在时才在 SQLite 中创建表

Pig CSVExcelStorage 双引号逗号

仅当它是所需类型时才绑定到接口(否则使用回退)?