从字符串的不同部分创建一个完整的数组,并删除perl中的重复

时间:2013-05-08 11:10:31

标签: arrays excel

我有一个问题。 我想我只是累了,因为我的大脑不想再思考了。 无论如何。 我有多个字符串,我从电子表格收集,每个字符串具有相同的布局,我正在搜索字符串中的特定部分。这是很容易的部分。所以字符串看起来像这样。

    this is a string from Japan
    this is a string from China
    this is a string from America
    this is a string from China
    this is a string from England
    this is a string from Japan

这些字符串不是本地字符串,但是我从excel表中收集它,所以我随后调用找到最后的每个字符串的位置,在这种情况下,我将采用这样的变量。

    use Spreadsheet::Read;
    my $book = ReadData ("INPUT.xlsx");
    my @rows = Spreadsheet::Read::rows ($book->[1]);

    my $count;
    $count = 0;

    my @clause_all;
    foreach my $tab(@rows) {

    $count ++;
    my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
    print $row[5]; # $row[5] would be the location like "japan, china, america etc.
    }

这是我正在努力的部分,循环看到$ row [5]作为单个术语,我现在需要删除重复并需要以某种方式连接每一行的$ row [5]以获得一个数组然后抛弃重复。我尝试这样做,但由于每个$ row [5]

的单数形式,它不起作用
    my %special = ();
    foreach (@my_array)
            {
    $special{$_} = 1;
            }
    my @deduped = keys %special;
    print "@deduped\n";

但是,如果我创建我自己的测试数组,它可以工作,除了它将它们从原始顺序中抛出,无论如何,所以它必须是获取存储在数组中的位置$ row [5]的问题。

    @my_test_array = ("Japan", "China", "America", "China", "England", "Japan")
    my %special = ();
    foreach (@my_test_array)
            {
    $special{$_} = 1;
            }
    my @deduped = keys %special;
    print "@deduped\n";

提前致谢!

--------------------------------

编辑!

--------------------------------

嗯,这确实有效,但不确定这有多整洁。 :)

    use Spreadsheet::Read;
    my $book = ReadData ("NSA_DB.xlsx");
    my @rows = Spreadsheet::Read::rows ($book->[1]);
    my $count;
    $count = 0;
    my @clause_all;
    foreach my $tab(@rows) {

        $count ++;
        my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
    push @array, "$row[3]\n";
    }
    my %special = ();

     foreach (@array)
        {
         $special{$_} = 1;
          }
            my @deduped = keys %special;
             print "@deduped";

再次感谢。

1 个答案:

答案 0 :(得分:0)

问题不是很清楚,但如果您只想为数组添加唯一值,以便这些值出现在源电子表格中:

my %added;
my @array;

for (whatever) {
    push @array, $_ unless exists $added{$_};
    $added{$_} = 1;
}

根据原始问题的更新:

use Spreadsheet::Read;

my $book = ReadData ("NSA_DB.xlsx");
my @rows = Spreadsheet::Read::rows ($book->[1]);
my @array;
my %added;

for (my $count = 1; $count <= @rows; $count++) {
    my @row = Spreadsheet::Read::cellrow ($book->[1], $count);
    push @array, $row[3] unless $added{$row[3]};
    $added{$row[3]} = 1;
}

print join("\n", @array), "\n";