0

ファイルからデータを取り出して、より使いやすい形式に変換するスクリプトに取り組んでいます。これまでのところ、以下に示す形式でデータを csv に取得することができました。

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

私が理解しようとしているのは、「名前」列のデータを取得して、次のような新しい変数を作成する方法です。

Rnixon01
Bdole01

どうにかして演算子を使用すると思いs///ますが、私はまだ perl に非常に慣れていません。よろしくお願いします。

4

3 に答える 3

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;

カウンターをインクリメントする方法: 他の回答を参照してください。

はい、これは正規表現の非常に精巧なバージョンですが、「実際に」遭遇する可能性があり、おそらく書くべきものでもあります。xin をxms使用すると、空白やコメントを正規表現に追加できます。eは、2 番目のブロックをコードとして評価するように Perl に指示します。そして、はい、s{}{}ネストされたブレースでも機能します;-)

正規表現演算子の構文の可能性の詳細については、 を参照してくださいperldoc perlop

于 2013-03-05T19:50:25.757 に答える
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

あなたはそれを行うことができます

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

最後に数字を追加します。これらの数字は、たとえば複数RNixonの を区別するためのシーケンス番号だと思います。その場合、各名前が発生した回数をカウントするためにハッシュが必要です。

このプログラムは

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 に答える