想要提取每个单词的第一个字母

时间:2013-10-04 06:45:16

标签: perl sas

我基本上有一个变量COUNTRY以及变量SUBJIDTREAT,我希望像 ABC002-123 / NZ / ABC 那样连接它。

假设COUNTRY变量的值为“New Zealand”。我想提取每个单词的第一个字母,但是我想只在COUNTRY变量中只有一个单词时提取值的前两个字母。我想知道如何简单地下面的代码。如果可能,请使用 perl编程

If COUNTW(COUNTRY) GT 1 THEN 
  CAT_VAR=
   UPCASE(SUBJID||"/"||CAT(SUBSTR(SCAN(COUNTRY,1,'     '),1,1),
                 SUBSTR(SCAN(COUNTRY,2,' '),1,1))||"/"||TREAT);

5 个答案:

答案 0 :(得分:4)

my @COUNTRY = ("New Zealand", "Germany");

# 'NZ', 'GE'
my @two_letters = map {
  my @r = /\s/ ? /\b(\w)/g : /(..)/;
  uc(join "", @r);
} @COUNTRY;

答案 1 :(得分:4)

SAS Perl正则表达式解决方案是使用CALL PRXNEXT以及PRXPOXNCALL PRXPOSN(或类似函数,如果您愿意):

data have;
infile datalines truncover;
input @1 country $20.;
datalines;
New Zealand
Australia
Papua New Guinea
;;;;
run;

data want;
set have;
length country_letter $5.;
prx_1 = prxparse('~(?:\b([a-z])[a-z]*\b)+~io');
length=0;
start=1;
stop = length(country);
position=0;
call prxnext(prx_1,start,stop,country,position,length);
do while (position gt 0);
    matchletter = prxposn(prx_1,1,country);
    country_letter = cats(country_letter,matchletter);
    call prxnext(prx_1,start,stop,country,position,length);
    put i= position= start= stop=;  
end;
run;

答案 2 :(得分:3)

我意识到OP可能对另一个答案不感兴趣,但对于浏览此线程并且不想使用Perl表达式的其他用户,我建议使用以下简单解决方案(对于原始的COUNTRY变量):

FIRST_LETTERS = compress(propcase(COUNTRY),'','l');

propcase函数将每个单词的首字母大写,并将其他单词放在小写字母中。带'l'修饰符的压缩函数会删除所有小写字母 COUNTRY可能包含任意数量的字词。

答案 3 :(得分:2)

这个怎么样:

#!/usr/bin/perl
use warnings;
use strict; 

my @country = ('New Zealand', 'Germany', 'Tanzania', 'Mozambique', 'Irish Repuublic');

my ($one_word_letters, $two_word_letters, @initials);
foreach (@country){
        if ($_ =~ /\s+/){ # Captures CAPs if 'country' contains a space
            my ($first_letter, $second_letter) = ($_ =~ /([A-Z])/g); 
            my ($two_word_letters) = ($first_letter.$second_letter);
            push @initials, $two_word_letters; # Add to array for later
        }
        else {  ($one_word_letters) = ($_ =~ /([A-Z][a-z])/); # If 'country' is only one word long, then capture first two letters (CAP+noncap)
        push @initials, $one_word_letters; # Add this to the same array
    }   
}       

foreach (@initials){ # Print contents of the capture array:
    print "$_\n";
}

输出:

NZ
Ge
Ta
Mo
IR

如果真的没有三个字的国家,这应该做的工作。如果有的话,很容易修复......

答案 4 :(得分:2)

应该这样做。

#!/usr/bin/perl

$init = &getInitials($ARGV[0]);

if($init)
{
    print $init . "\n";
    exit 0;
}
else
{
    print "invalid name\n";
    exit 1;
}


1;

sub getInitials {
    $name = shift;
    $name =~ m/(^(\S)\S*?\s+(\S)\S*?$)|(^(\S\S)\S*?$)/ig;
    if( defined($1) and $1 ne '' ) {
        return uc($2.$3);
    } elsif( defined($4) and $4 ne '' ) {
        return uc($5);
    } else {
        return 0;
    }
}