加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

正则表达式 – 如何删除冗余字段并合并结果行

发布时间:2020-12-14 05:36:25 所属栏目:百科 来源:网络整理
导读:我正在尝试处理纯文本文件.它基本上是一个名称和相关数字字段的索引,格式如下: Nowosielski,Matthew,484,584,777 Nowosielski,1151 Nunes,Paulino,116 Nussbaum,Mike,1221,444, Nussbaum,156 我想对此进行处理 Nowosielski,777,156,1221 正如您所看到的,这
我正在尝试处理纯文本文件.它基本上是一个名称和相关数字字段的索引,格式如下:

Nowosielski,Matthew,484,584,777
Nowosielski,1151
Nunes,Paulino,116
Nussbaum,Mike,1221,444,
Nussbaum,156

我想对此进行处理

Nowosielski,777,156,1221

正如您所看到的,这些行并不是一致的:有些可能是空格,有些是新行,有些则是逗号.实际上,我需要合并以重复的全名开头的行,在合并和保留数字字段的数字顺序时丢弃冗余名称条目.

我的直觉告诉我要学习一些快速的perl或awk,但我的技能组合对于两者都是空的.我调查了两者,经过一些搜索和阅读后,我们找不到一条清晰或干净的解决方案.

因此,我的问题是:什么是我可能有效学习并且足以完成这项任务的最佳工具?另外,根据建议的工具,是否有任何关于如何解决问题的建议?

当然,我可以手动编辑这个文件,但这不是很有趣,而且似乎是一个非常愚蠢的,对这个问题很有帮助的方法.我正在以此任务为借口,学习一些关于文本处理的内容,因为它感觉像是一个问题,可能是一个好的,现有的工具.

有什么指针吗?

解决方法

正如Brian所说,使用哈希表.下面删除换行符,在逗号上拆分每个记录,使用“姓氏,名字”原始形式作为哈希的键,将剩余的值推送到数组中,并使用对所述数组的引用作为上述键的值.

然后它只是迭代哈希中的键/值对并相应地格式化.

修改后的解决方案 – 排序数字,省略中间名称和排序输出

#!/usr/bin/env perl
use strict;
use warnings;

my %merged;

while (my $record = <DATA>) {
    chomp $record;
    my ($lname,$fname,@stuff) = split /[,]+/,$record;
    push @{ $merged{"$lname,$fname"} },grep { m/^d+$/; } @stuff;
}

foreach my $name (sort keys %merged) {
    print $name,",join( ',',sort { $a <=> $b } @{$merged{$name}}),"n";
}

__DATA__
Nowosielski,777
Nowosielski,1151
Nunes,116
Nussbaum,Nussbaum,156
Nowosielski,Kimball,485,684,277

修改后的产出

Nowosielski,277,1221

原始解决方案

#!/usr/bin/env perl
use strict;
use warnings;

my %merged;

while (my $record = <DATA>) {
    chomp $record;
    my ($lname,@stuff) = split /,/,$record;

    push @{ $merged{"$lname,@stuff;
}

while (my ($name,$stuff) = each %merged) {
    print $name,@$stuff),"n"; 
}

__DATA__
Nowosielski,156

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读