【问题标题】:How to remove entire array that have specific character如何删除具有特定字符的整个数组
【发布时间】:2019-04-25 09:23:18
【问题描述】:

我有一个从 .xls 文件中提取的 perl 代码。我的 .xls 文件如下

NUMBER    NAME    ALPHABET
one       Jane        a
two       Adam        b
three     Josh        c
;four  
five      Agnes       e 
six       Mary        f
;seven 
eight     Lara        h        

我想提取信息,只取第 1 列和第 2 列。我的 perl 代码如下。

     #!/usr/bin/perl

     use warnings;
     use strict;
     use Spreadsheet::ParseExcel;

     main ();

     sub main {

        my $filename = 'Book1.xls';
        my $parser   = Spreadsheet::ParseExcel->new();
        my $workbook = $parser->parse( $filename );

        if ( !defined $workbook ) {
           die "-E-: cannot parse <$filename>.\n ", $parser->error(), ".\n";
        }

        my $worksheet             = $workbook -> Worksheet ( 'a' ) || die "-E-: cannot parse family pin list.\n";   
        my ( $row_min, $row_max ) = $worksheet-> row_range();

        open ( my $file,"> output.txt");

        for my $row ( 1 .. $row_max ) {

           my @data;

           for my $col ( 0 ) {
              my $number = $worksheet-> get_cell( $row, $col );
              if ( $number ) {
                 push @data, $number-> value();
              }
              else {
                 push @data, '';
              }
            }

            for my $col ( 2 ) {
               my $alphabet = $worksheet->get_cell( $row, $col );
               if ( $alphabet ) {
                  push @data, $alphabet->value();
                  print $file  "@data\n";
               }
               else {
               push @data, '';
               }
            }     

     }

     close $file;

      print "done\n";
     }

结果是

    one a
    two b
    three c
    ;four 
    five e
    six f
    ;seven 
    eight h

我想删除以字符串“;”开头的整个数组。我像下面这样扩展我的代码

        open ( my $file,"> output.txt");

        for my $row ( 1 .. $row_max ) {

           my @data;

           for my $col ( 0 ) {
              my $number = $worksheet-> get_cell( $row, $col );
              if ( $number ) {
                 push @data, $number-> value();
              }
              else {
                 push @data, '';
              }
            }

            for my $col ( 11 ) {
               my $alphabet = $worksheet->get_cell( $row, $col );
               if ( $alphabet ) {
                  push @data, $alphabet->value();
               }
               else {
               push @data, '';
               }
            }


      my @new_data = grep(!/;/, @data);
      my @latest_data = grep ( $_ ne '', @new_data);
      print $file  "@latest_data\n";


     }

     close $file;

      print "done\n";
     }

输出结果如下所示。

     one a
     two b
     three c

     five e
     six f

     eight h

我不想成为空白。我想如何消除产生如下结果的空白空间?

     one a
     two b
     three c
     five e
     six f
     eight h

我也尝试这样做,但结果是一样的。

     for my $index (reverse 0..$#data) {
        if ( $data[$index] =~ /^;/ ) {
        splice(@data, $index, 1);
       }
     }
     print $file "@data\n";

【问题讨论】:

  • 请记住,空字符串(零长度)和空白字符串(都是空格类型的字符)是两个不同的东西。测试/\S+/ 以查找包含内容的字符串。
  • 如果你不想在你的数组中有空字符串,你为什么要把它们放在那里?删除两个else { push @data, '' } 子句,看看数据是否对您更有用。
  • “输出结果”不清楚——如何在六到七之间得到一个空行?输入中这两行之间没有任何内容。
  • "之间有元素" --- 不,不在六和七之间,没有。

标签: perl


【解决方案1】:

希望您正在寻找next

use warnings;
use strict;

@data=("one a", "two b","three c", ";four d","five e","six e","seven g","eight h")
for(@data){
    next if (/^;/);
    print $_,"\n";
}

【讨论】:

    【解决方案2】:

    让我们获取您的数据要点

    @data=("one a", "two b","three c", ";four d","five e","six e","seven g","eight h")
    for(@data){
    s/^;.*//;              # // <-- Put Replacer here between `//` , leave it to remove line
    push(@new_data,$_)}
    print "$_\n" for @new_data
    

    【讨论】:

    • 嗨 abdan,感谢您的建议,但它对我不起作用
    • 从该代码中,它只删除了特殊字符。我想删除所有行并用它之后的元素替换该行
    猜你喜欢
    • 1970-01-01
    • 2020-03-27
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2018-06-29
    • 2019-02-08
    • 2018-12-09
    • 2021-08-20
    相关资源
    最近更新 更多