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

前端之家收集整理的这篇文章主要介绍了正则表达式 – 如何删除冗余字段并合并结果行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我正在尝试处理纯文本文件.它基本上是一个名称和相关数字字段的索引,格式如下:

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

猜你在找的正则表达式相关文章