我一直在研究一个脚本,该脚本从文件中提取数据并将其转换为更易用的格式。到目前为止,我已设法以下面显示的格式将数据提供给csv。
data1 data2 name data3
00958c JMOP Nixon, Richard e004a
00967c CMLL Dole, Bob a006n
我想要解决的是如何获取“名称”列中的数据并创建一个新变量,如:
Rnixon01
Bdole01
我猜我会以某种方式使用s///
运算符,但我仍然是perl的新手。提前感谢您的帮助。
答案 0 :(得分:1)
听起来你已经知道如何parse the CSV,而你只是在寻找
my ($lname, $fname) = split /,\s*/, $name;
my $id = uc(substr($fname, 0, 1)) . lc($lname);
$id .= sprintf '%02d', ++$counts{$id};
答案 1 :(得分:1)
这是直接使用s
运算符的那个:
$name =~ s{
([^, ]+) # Everything up to the space or comma, the last name
\s* , \s* # Comma, potentially with space around it
(\w) # The first letter of the first name
.* # The rest (which we don't want to capture, but want to replace)
}{
uc($2) . # First letter (upper case)
lc($1) # last name (lower case)
}xmse;
如何增加计数器:见其他答案。
是的,这是正则表达式的一个非常复杂的版本,但可能是你将“在野外”遇到的东西,也应该是写作。 x
中的xms
允许您向正则表达式添加空格甚至注释,e
告诉Perl将第二个块作为代码进行评估。是的,即使使用嵌套大括号,s{}{}
仍可正常工作; - )
有关正则表达式运算符的语法可能性的更多信息,请参阅perldoc perlop
。
答案 2 :(得分:1)
你可以用
做到这一点$name =~ s/([^,]+),\s*([^,]).*/$2$1/
然后在末尾添加数字。我假设这些数字是一个序列号来区分,比如多个RNixon
s。在这种情况下,您需要一个哈希来记录每个名称的发生次数。
该程序演示
use strict;
use warnings;
use 5.014;
my %sequence;
for ('Nixon, Richard', 'Dole, Bob') {
my $name = s/([^,]+),\s*([^,]).*/$2$1/r;
$name = sprintf '%s%02d', $name, ++$sequence{$name};
print "$name\n";
}
<强>输出强>
RNixon01
BDole01