如何操作csv中的字符串以从选择列中的所有字符串中删除部分?

时间:2013-03-05 19:25:49

标签: perl csv

我一直在研究一个脚本,该脚本从文件中提取数据并将其转换为更易用的格式。到目前为止,我已设法以下面显示的格式将数据提供给csv。

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

我想要解决的是如何获取“名称”列中的数据并创建一个新变量,如:

Rnixon01
Bdole01

我猜我会以某种方式使用s///运算符,但我仍然是perl的新手。提前感谢您的帮助。

3 个答案:

答案 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