[Cascavel-pm] retirando dados de texto pra bd mysql...

Nelson Ferraz nferraz em phperl.com
Quarta Abril 14 10:28:57 CDT 2004


Gabriel Rodrigues wrote:

> Tenho um arquivo com essas características...
> 
>>gnl|uv|J01749.1:1-4361-49 Cloning vector pBR322
> 
> TTCTCATGTTTGACAGCTTATCATCGATAAGCTTTAATGCGGTAGTTTATCACAGTTAAATTGCTAACGC
> AGTCAGGCACCGTGTATGAAATCTAACAATGCGCTCATCGTCATCCTCGGCACCGTCACCCTGGATGCTG
> TAGGCATAGGCTTGGTTATGCCGGTACTGCCGGGCCTCTTGCGGGATATCGTCCATTCCGACAGCATCGC
> 
> gostaria de pegar antes de tudo o codigo que estah
> depois do segundo pipe '|' ateh o primeiro espaço que
> vier, mandando o mesmo para uma coluna no mysql...

Gabriel,

Eu vi que algumas pessoas já responderam, então vou enviar um exemplo 
didático, de como o programa poderia ser feito.

Você deveria começar o script com um loop:

while (my $linha = <>) {
   chomp $linha; # remove o "\n" do final
   next unless $linha =~ m/(.+?)|(.+?)|(.+?)\s(.+)/;
   # continua...
}

Com isso, o programa vai varrer o arquivo em busca de uma linha que case 
com o padrão m/(.+?)|(.+?)|(.+?)\s(.+)/.

Por exemplo, a seguinte linha faria o programa seguir adiante:

gnl|uv|J01749.1:1-4361-49 Cloning vector pBR322

Não apenas isso, mas depois desta linha os valores dos campos são 
armazenados em "variáveis mágicas", $1, $2, $3 e $4.

Então, o código da primeira parte do programa seria mais ou menos assim:

while (my $linha = <>) {
   chomp $linha; # remove o "\n" do final da linha
   next unless $linha =~ m/(.+?)|(.+?)|(.+?)\s(.+)/;

   my ($campo,$campo2,$campo3,$campo4) = ($1,$2,$3,$4);

   # continua...
}

> depois pegar o que estiver depois do espaco e mandar
> para um outro campo no bd mysql...
> 
> Depois disso pegar estah mesma linha que inicia com
> '>' INTEIRA e enviar para uma outra coluna.

Eu recomendaria separar os campos na base de dados:

   my $query = "INSERT INTO tabela (campo1,campo2,campo3,campo4)
                VALUES ($campo1,$campo2,$campo3,$campo4)";

Mas se você precisar *mesmo* da linha inteira, basta usar a variável 
$linha, definida anteriormente.

> Em seguida tem que enviar todo o codigo que vem com as
> letras ACGT para um unico campo tipo binario. São
> todas as letras ateh a proxima entrada que começar com
> outro '>' que aí já não faz mais parte da sequencia
> antiga...

Partindo do principio que a sequencia vem na linha seguinte, você 
precisaria fazer alguma coisa como:

   my $linha2 = <>; # pega a sequência
   chomp $linha2;   # remove o "\n" do final

   my $query = "INSERT INTO tabela (campo1,campo2,campo3,campo4)
                VALUES ($campo1,$campo2,$linha,$linha2)";

Nós realmente precisaríamos conhecer a estrutura do arquivo-texto para 
oferecer uma solução mais adequada.

Dica final: "perldoc perlretut"

-- 
[]s

Nelson

________________________________________________________________
Nelson Ferraz

GNU BIS: http://www.gnubis.com.br
PhPerl:  http://www.phperl.com




Mais detalhes sobre a lista de discussão Cascavel-pm