Em Perl, como posso ler partes das linhas que correspondem a um critério? [duplicado]

StackOverflow https://stackoverflow.com/questions/1114522

  •  12-09-2019
  •  | 
  •  

Pergunta

Esta questão já tem uma resposta aqui:

Amostra de dados:

603       Some garbage data not related to me, 55, 113 ->

1-ENST0000        This is sample data blh blah blah blahhhh
2-ENSBTAP0        This is also some other sample data
21-ENADT)$        DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0        This is third sample data
node #4           This is 4th sample data
node #5           This is 5th sample data

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
      44, 1,1,4,1

17, 1150

637                   YYYYYY: 2 : %

EDIT: Nos dados acima. A largura da coluna é fixa para as seções, mas pode haver algumas seções eu não desejam ler. acima de dados de amostra tenha sido editado para reflectir isto.

Assim, neste arquivo de entrada eu quero ler conteúdo da primeira seção '1-ENST0000' em uma matriz e conteúdo de '2-ENSBTAP0' em uma matriz separada e assim por diante.

Estou tendo dificuldades para chegar com um regex que vai definir o padrão ... primeiros três linhas têm <someNumber>-ENS<someotherstuf> e depois há também pode ser node #<some number here>

Foi útil?

Solução

OK, com base no seu comentário mais tarde, esta é uma diferente pouco do que a questão anterior. Além disso, eu agora percebo que node #54 é uma entrada válida na primeira coluna.

Update: Agora eu também perceber que você não precisa a primeira coluna

.

Update:. Em geral, você não quer nem necessidade de lidar com arrays de caracteres em Perl

Update: Agora que você esclareceu o que deve e não deve ser ignorada, aqui está uma versão que lida com isso. Adicionar padrões de gosto na condição if.

#!/usr/bin/perl

use strict;
use warnings;

my @data;

while ( <DATA> ) {
    chomp;

    if ( /^[0-9]+-ENS.{5} +(.+)$/
            or /^node #[0-9]+ +(.+)$/
    ) {
        push @data, [ split //, $1 ];
    }
}

use Data::Dumper;
print Dumper \@data;

__DATA__
603       Some garbage data not related to me, 55, 113 ->

1-ENST0000        This is sample data blh blah blah blahhhh
2-ENSBTAP0        This is also some other sample data
21-ENADT)$        DO NOT WANT TO READ THIS LINE. 
3-ENSGALP0        This is third sample data
node #4           This is 4th sample data
node #5           This is 5th sample data

This is also part of the input file but i dont wish to read this. 
Branch -> 05 13, 
      44, 1,1,4,1

17, 1150

637                   YYYYYY: 2 : %

Como para aprender a pescar, eu recomendo que você leia tudo relacionado na perldoc perltoc .

Outras dicas

Esta é realmente um arquivo-coluna fixa? Se assim for, então não se preocupar com regexps. Apenas dividir a largura da coluna, talvez aparar espaços em branco a partir columen 1.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top