读取文件的行数。

时间:2020-12-22 21:50:17

Suppose I'm reading each line of the following data:

假设我正在阅读以下数据的每一行:

40556;20/02/2001;;MG;M^12/08/67^F^16/03/89^SP^14/02/61
;;;;;M1|F1|SP1;12;11;11;7;7;12;54.340;CSF1PO
;;;;;M1|F1|SP1;8;6;6;8;8;8;2.036;TPOX
;;;;;M1|F1|SP1;8;9.3;9.3;9;9;9.3;3.077;TH01
;;;;;F1|SP1;;;7;9.3;9.3;9.3;2.419;TH01
;;;;;F1|SP1;;;16;18;18;17;1.361;vWA
;;;;;F1|SP1;;;9;16;16;15;1.366;D18S51
40555;20/02/2001;;MG;F^23/06/2000^SP^01/09/64
;;;;;F1|SP1;;;11;13;12;12;Exclusão;D16S539
;;;;;F1|SP1;;;12;8;9;9;Exclusão;D7S820
;;;;;F1|SP1;;;14;10;9;9;Exclusão;D13S317
;;;;;M1|F1|SP1;13;14;14;14;14;12;-;D16S539
;;;;;M1|F1|SP1;10;8;8;9;8;11;Exclusão;D7S820
;;;;;M1|F1|SP1;12;12;12;8;11;11;Exclusão;D13S317

I split the lines as following:

我把这些线分开如下:

my @fields = split /;/;

Notice that, in the lines beginning with empty space ($fields[0] eq ""), I have a kind of pattern (M1|F1|SP1 or F1|SP1), then it changes to the other kind in the lines below.

请注意,在以空空间开始的行($fields[0] eq ")中,我有一种模式(M1|F1|SP1或F1|SP1),然后在下面的行中它将变为另一种模式。

I'd like to skip the lines when the pattern changes, compared to the first line. I'm reading this data inside a loop. So it would be nice to start the loop again once it gets to the different pattern, or maybe go to the next line beginning with a number. How can I do that?

与第一行相比,我想在模式改变时跳过这几行。我正在循环中读取这些数据。所以当它到达不同的模式时,最好重新开始循环,或者可以用数字开始下一行。我怎么做呢?

1 个解决方案

#1


1  

If I understand it correctly, you need something like this:

如果我理解正确,你需要这样的东西:

use strict; use warnings;
use constant { SKIP=>1, READ=>2 };
my ($skip, $pattern) = (SKIP, "");
while (<DATA>) { chomp;
    my @v = split(/;/);
    if ($skip == SKIP and $v[0] =~ /\d+/) { 
        $pattern=""; $skip = READ;
    } elsif ($skip == READ) {
        $pattern = "$v[5]" if not $pattern;
        if ($pattern eq $v[5] ) { 
            print( join(",", @v), "\n");
        } else { $skip = SKIP; }
    }
}

__DATA__
40556;20/02/2001;;MG;M^12/08/67^F^16/03/89^SP^14/02/61
;;;;;M1|F1|SP1;12;11;11;7;7;12;54.340;CSF1PO
;;;;;M1|F1|SP1;8;6;6;8;8;8;2.036;TPOX
;;;;;M1|F1|SP1;8;9.3;9.3;9;9;9.3;3.077;TH01
;;;;;F1|SP1;;;7;9.3;9.3;9.3;2.419;TH01
;;;;;F1|SP1;;;16;18;18;17;1.361;vWA
;;;;;F1|SP1;;;9;16;16;15;1.366;D18S51
40555;20/02/2001;;MG;F^23/06/2000^SP^01/09/64
;;;;;F1|SP1;;;11;13;12;12;Exclusão;D16S539
;;;;;F1|SP1;;;12;8;9;9;Exclusão;D7S820
;;;;;F1|SP1;;;14;10;9;9;Exclusão;D13S317
;;;;;M1|F1|SP1;13;14;14;14;14;12;-;D16S539
;;;;;M1|F1|SP1;10;8;8;9;8;11;Exclusão;D7S820
;;;;;M1|F1|SP1;12;12;12;8;11;11;Exclusão;D13S317

#1


1  

If I understand it correctly, you need something like this:

如果我理解正确,你需要这样的东西:

use strict; use warnings;
use constant { SKIP=>1, READ=>2 };
my ($skip, $pattern) = (SKIP, "");
while (<DATA>) { chomp;
    my @v = split(/;/);
    if ($skip == SKIP and $v[0] =~ /\d+/) { 
        $pattern=""; $skip = READ;
    } elsif ($skip == READ) {
        $pattern = "$v[5]" if not $pattern;
        if ($pattern eq $v[5] ) { 
            print( join(",", @v), "\n");
        } else { $skip = SKIP; }
    }
}

__DATA__
40556;20/02/2001;;MG;M^12/08/67^F^16/03/89^SP^14/02/61
;;;;;M1|F1|SP1;12;11;11;7;7;12;54.340;CSF1PO
;;;;;M1|F1|SP1;8;6;6;8;8;8;2.036;TPOX
;;;;;M1|F1|SP1;8;9.3;9.3;9;9;9.3;3.077;TH01
;;;;;F1|SP1;;;7;9.3;9.3;9.3;2.419;TH01
;;;;;F1|SP1;;;16;18;18;17;1.361;vWA
;;;;;F1|SP1;;;9;16;16;15;1.366;D18S51
40555;20/02/2001;;MG;F^23/06/2000^SP^01/09/64
;;;;;F1|SP1;;;11;13;12;12;Exclusão;D16S539
;;;;;F1|SP1;;;12;8;9;9;Exclusão;D7S820
;;;;;F1|SP1;;;14;10;9;9;Exclusão;D13S317
;;;;;M1|F1|SP1;13;14;14;14;14;12;-;D16S539
;;;;;M1|F1|SP1;10;8;8;9;8;11;Exclusão;D7S820
;;;;;M1|F1|SP1;12;12;12;8;11;11;Exclusão;D13S317