首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >提取CSV列的值以添加属性

提取CSV列的值以添加属性
EN

Stack Overflow用户
提问于 2019-06-05 01:49:49
回答 2查看 837关注 0票数 0

我正在使用NiFi中的一些CSV,我的流水线正在产生一些副本。因此,我想使用DetectDuplicate处理器,但为了做到这一点,我需要有一些属性,它可以与之进行比较以检测重复。我有一个ExtractText处理器,我想使用正则表达式来获取SHA1_BASE16列中的值。

我在下面的CSV上尝试了下面的regex字符串(由一个朋友建议,我不完全理解),但突出显示了不正确的字段和一些无关的东西。如何才能让它只捕获SHA1_BASE16值?

RegEx

代码语言:javascript
复制
^[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),[^,]*,[^,]*,[^,]*,[^,]*,[^,]*,([^,]*),[^,]*,[^,]*,([^,]*)\S*

CSV

代码语言:javascript
复制
"USER_JID","CREATED_AT","UPLOAD_TIME","SHA1_BASE32","SHA1_BASE16","HASH_SOURCE","MESSAGE_TYPE","IPV4"
"dreynolds","1932/04/01 20:23:35 UTC","2016/12/28 20:23:11 UTC","72F20077A79A0D4D90F4C0669FB6EA4BC5953293","FB1D928B83DEBCD2B2E53DF4C8D4C2AF99EB81E0","HOLLYWOOD","TWITTER","123.123.123.123"

实际输出

代码语言:javascript
复制
Match 1
Full match  0-291   "USER_JID","CREATED_AT","UPLOAD_TIME","SHA1_BASE32","SHA1_BASE16","HASH_SOURCE","MESSAGE_TYPE","IPV4...
Group 1.    66-79   "HASH_SOURCE"
Group 2.    209-251 "FB1D928B83DEBCD2B2E53DF4C8D4C2AF99EB81E0"
Group 3.    274-291 "123.123.123.123"

期望的输出

代码语言:javascript
复制
Match 1
Full match  0-291   "USER_JID","CREATED_AT","UPLOAD_TIME","SHA1_BASE32","SHA1_BASE16","HASH_SOURCE","MESSAGE_TYPE","IPV4...
Group 1.    209-251 "FB1D928B83DEBCD2B2E53DF4C8D4C2AF99EB81E0"
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2019-06-05 02:02:46

我猜我们这里将有两个40个字符的字符串,我们将使用第一个作为左边界,并应用这个简单的表达式:

代码语言:javascript
复制
.+"[A-Z0-9]{40}",("[A-Z0-9]{40}").+

其中我们想要的输出在这个捕获组中:

代码语言:javascript
复制
("[A-Z0-9]{40}")

我们可以使用$1

Demo

测试

代码语言:javascript
复制
const regex = /.+"[A-Z0-9]{40}",("[A-Z0-9]{40}").+/gm;
const str = `"dreynolds","1932/04/01 20:23:35 UTC","2016/12/28 20:23:11 UTC","72F20077A79A0D4D90F4C0669FB6EA4BC5953293","FB1D928B83DEBCD2B2E53DF4C8D4C2AF99EB81E0","HOLLYWOOD","TWITTER","123.123.123.123"`;
let m;

while ((m = regex.exec(str)) !== null) {
    // This is necessary to avoid infinite loops with zero-width matches
    if (m.index === regex.lastIndex) {
        regex.lastIndex++;
    }
    
    // The result can be accessed through the `m`-variable.
    m.forEach((match, groupIndex) => {
        console.log(`Found match, group ${groupIndex}: ${match}`);
    });
}

RegEx电路

jex.im可视化正则表达式:

票数 0
EN

Stack Overflow用户

发布于 2019-06-05 03:12:15

或者,您可以使用PartitionRecord将记录拆分为流文件,其中每个记录的分区字段(在本例中为SHA1_BASE16)具有相同的值。它还将在流文件上为分区值设置一个属性,然后您可以在DetectDuplicate中使用该属性。

对于高基数字段(不会有很多重复的字段),您可能会看到性能受到影响,因为每个传出流文件中可能只有一行,因此对于大量行,您将获得大量流文件。也就是说,你可以在record.count > 1的地方使用DetectDuplicate,而不是在下游使用RouteOnAttribute,这样就不需要DistributedMapCache了。

还有一个contribution to add a DetectDuplicateRecord processor,我想这才是你真正想要的。这一贡献正在审查中,我希望它能进入NiFi的下一个版本。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/56448999

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档