0

我一直在研究一个脚本,它从文件中提取数据并将其转换为更可用的格式。到目前为止,我已经设法以如下所示的格式将数据转换为 csv。

data1   data2   name        data3
00958c  JMOP    Nixon, Richard  e004a
00967c  CMLL    Dole, Bob             a006n

我要弄清楚的是如何获取“名称”列中的数据并创建一个新变量,例如:

Rnixon01
Bdole01

我猜我会s///以某种方式使用运算符,但我对 perl 还是很陌生。预先感谢您的任何帮助。

4

3 回答 3

1

听起来您已经知道如何解析 CSV并且您只是在寻找

my ($lname, $fname) = split /,\s*/, $name;
my $id = uc(substr($fname, 0, 1)) . lc($lname);
$id .= sprintf '%02d', ++$counts{$id};
于 2013-03-05T19:35:04.400 回答
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;

如何增加计数器:查看其他答案。

是的,这是正则表达式的一个非常精细的版本,但可能是你会“在野外”遇到的东西,也应该是写的。xinxms允许您在正则表达式中添加空格甚至注释,它告诉ePerl 将第二个块评估为代码。是的,s{}{}作品,即使有嵌套的大括号;-)

有关正则表达式运算符的语法可能性的更多信息,请参阅perldoc perlop

于 2013-03-05T19:50:25.757 回答
1

你可以这样做

$name =~ s/([^,]+),\s*([^,]).*/$2$1/

然后在末尾添加数字。我假设这些数字是用于区分多个RNixons 的序列号。在这种情况下,您需要一个哈希来计算每个名称出现的次数。

这个程序演示

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
于 2013-03-05T19:54:03.413 回答