Ir para o conteúdo
  • Revista PROGRAMAR: Já está disponível a edição #60 da revista programar. Faz já o download aqui!

ssofia

Comparar linha de ficheiro com outro ficheiro completo

Mensagens Recomendadas

ssofia

Ola

Eu vou iniciar um codigo para ler um ficheiro_1 que tem esta estrutura:

atatacacacatacat

taccagatacagatc

acagatacagtatag

gcccagatagacac

e de seguida ele vai procurar no ficheiro_2 (ficheiro com varias sequencias) se a linha 1 do ficheiro_1 existe no ficheiro_2, depois procura se linha 2 se encontra no ficheiro_2 e assim ate ao fim do ficheiro_1....

Se ele encontrar a sequencia ele guarda em COM.txt se nao ele guarda em NOV.txt

Eu estruturei algo do genero o que vos parece? o que acham que devo modificar no codigo? Obrigado

#!/usr/bin/perl

use strict;
use warnings;
use autodie;

# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....Se sim guardar em livraria_comment se nao existir guardar na livraria_nova


my $f1 = shift || "/Users/ssofia/Desktop/test1.txt";
my $f2 = shift || "/Users/ssofia/Desktop/test2.txt";

my $outfile_1 = "/Users/ssofia/Desktop/RESULTS_1.txt";
my $outfile_2 = "/Users/ssofia/Desktop/RESULTS_2.txt";

my %results;


open my $file1, '<', $f1;

while (my $line = <$file1>) {

 $results{$line} = 1

}


open my $file2, '<', $f2;

while (my $line = <$file2>) {

 $results{$line}++

}


open (OUTFILE, ">$outfile_1") or die "Cannot open $outfile for writing \n";
open (OUTFILE, ">$outfile_2") or die "Cannot open $outfile for writing \n";



if ($line_file1 eq $file2) {

 OUTFILE $line_file1 ">$outfile_1" ;

} else {

 print OUTFILE $line_file1 ">$outfile_2";

}

Editado por Rui Carlos
geshi

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Oi bom dia.

#!/usr/bin/perl

use feature qw(:5.10); # para poder utilizar novas funcionalidades implementadas a partir do Perl 5.10+
				                # recomendava-te a utilizar este pragma sempre. Este pragma e equivalente ao "use v5.10".
				                # Para utilizares este pragma a tua versao do Perl deve ser 5.10+, se a tua versao do Perl
							    # for por exemplo 5.12 podes utilizar este pragma ou este aqui "use feature qw(:5.12);"
use strict;
use warnings;
use autodie;
# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....Se sim guardar em livraria_comment se nao existir guardar na livraria_nova

# recomendava utilizares os o Getopt::Long, mesmo para um script pequeno como este. para mais informacoes utiliza o comando "perldoc Getopt::Long".
my $f1 = shift || "/Users/ssofia/Desktop/test1.txt";
my $f2 = shift || "/Users/ssofia/Desktop/test2.txt";
my $outfile_1 = "/Users/ssofia/Desktop/RESULTS_1.txt";
my $outfile_2 = "/Users/ssofia/Desktop/RESULTS_2.txt";
my %results;

open my $file1, '<', $f1; # e uma boa pratica se definises os nomes para FILE_HANDLES em maiusculas
					  # tambem seria uma boa pratica se verificasses um ficheiro existe antes de o abrires para leitura
					  # podias fazer algo como :
					  # open my $FILE_1, "<", $f1 if -f $f1;
while (my $line = <$file1>)
{
chomp $line; # remover o "\n" da linha, assim como a leitura a partir do STDIN
			 # se estas a ler algo a partir do teclado ou ficheiro tens de remove o carater "\n" do final da linha
			 # ou valor introduzido pelo teclado

$results{$line} = 1
}

open my $file2, '<', $f2;
while (my $line = <$file2>)
{
chomp $line; # nao te esquecas do chomp!
$results{$line}++
}
# nestas duas linhas nao precisas do die() pois estas a usar o pragma "use autodie", o qual chama die() implicitamente
# nas situacoes de erro.
# Estas a utilizar o mesmo FILE_HANDLE para dois ficheiros distintos! O que o open() faz e abre/cria (se nao existir) o ficheiro cujo nome
# esta $outfile_1 utilizando o FILE_HANDLE OUTFILE, e imediatamente a sequir voltas a chamar o open() com o mesmo FILE_HANDLE que chamaste o
# open() anteriormente o que torna a chamada a primeira chamada ao open() sem sentido! Pois ao chamares o open pela segunda vez com um FILE_HANDLE
# aberto este e fechado de forma a ser utilizado para abrir o outro ficheiro.
open (OUTFILE, ">$outfile_1") or die "Cannot open $outfile for writing \n"; # esta linha podia ficar assim :
																		# open my $OUT_11_FH, ">", "$outfile_1";
open (OUTFILE, ">$outfile_2") or die "Cannot open $outfile for writing \n"; # open my $OUT_2_FH, ">", "$outfile_2";

# tens 3 erros aqui
# 1 -> $line_file1 nao existe (lembra que estas a utilizar o pragma strict)
# 2 -> pelo nome da variavel "$line_file1" suponho que querias que a variavel tivesse o valor de uma linha e estas
#a compata-la com o um FILE_HANDLE
# 3 -> falta a funcao print() na instrucao dentro do if.
if ($line_file1 eq $file2) {

OUTFILE $line_file1 ">$outfile_1" ; # podia assim : say OUTFILE "$line_file1 >$outfile_1";
} else {
print OUTFILE $line_file1 ">$outfile_2"; # recomendava-te a funcao say() ao inves do print(), pois com say()
# nao escreve o carater "\n" no final (a nao ser se inicializares a "Perl Var"
# $\ = "\n";
}

Editado por eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites
eatg75

Hey fiz uma dummy implementacao do que querias eis o codigo:

#!/usr/bin/env perl
use feature qw(:5.12); # utilzar a versao 5.12 do perl
use strict;
use warnings;
use autodie; # die() implicito em situacoes de erro.

use Getopt::Long; # parser das opcoes da linda de command
use Pod::Usage; # para o manual de utilizacao deste script

# Script para ler dois ficheiros e verificar se sequencia do ficheiro 1 existe no ficheiros 2....
# Se sim guardar em livraria_comment se nao existir guardar na livraria_nova

# opcoes da linha de comando
my %options = (
file_1 =>  "/Users/ssofia/Desktop/test1.txt", # ficheiro por omissao
file_2 => "/Users/ssofia/Desktop/test2.txt", # ficheiro por omissao
matched_lines_file => "COM.txt", # contem linhas do file_1 encontradas no file_2
unmatched_lines_file => "NOV.txt", # contem linhas do file_2 nao encontradas no file_2,
help => 0, # invoca a documentacao completa deste script
usage => 0, # mostra o resumo deste script
);

my %file_2_lines;

GetOptions
"file-one=s" => \$options{file_1},
"file-two=s" => \$options{file_2},
"matched-lines-file=s" => \$options{matched_lines_file},
"unmatched-lines-file=s" => \$options{unmatched_lines_file},
"usage" => \$options{usage},
"help" => \$options{help} || pod2usage 2;

pod2usage 2 if $options{usage};
pod2usage 1 if $options{help};

# verifica se os argumentos passados sao ficheiros regulares, termina o programa caso a verificacao falhar
die "'$options{file_1}' nao existe!\n" unless -f $options{file_1}; # o "\n" apenas para impedir o die() de escrever para o STDOUT a linha com erro
die "'$options{file_2}' nao existe!\n" unless -f $options{file_2};

open FILE_2_FH, "<", "$options{file_2}";

# le o ficheiro e insere cada linha no hash
while (my $line = <FILE_2_FH>)
{
next unless $line =~ /^\w+/; # ignora linhas vazias, e seguro fazer isto antes do chomp() pois o "\n" nao e um carater elemento da classe \w
chomp $line;
$line =~ s/^\s+//; # remove espacos no inicio da linha
$line =~ s/\s+$//; # remove espacos no fim da linha
$file_2_lines{$line} = 1; # valor guardado e irelevante, o importante e a chave!
}

close FILE_2_FH;

open FILE_1_FH, "<", "$options{file_1}";
open MATCHED_LINES_FH, ">", "$options{matched_lines_file}";
open UNMATCHED_LINES_FH, ">", "$options{unmatched_lines_file}";

while (my $line = <FILE_1_FH>)
{
next unless $line =~ /^\w+/;
chomp $line;
$line =~ s/^\s+//;
$line =~ s/\s+$//;
if (exists $file_2_lines{$line}) { say MATCHED_LINES_FH "+>$line"; }
else { say UNMATCHED_LINES_FH "->$line"; }
}

# fecha os FileHandles abertos
close FILE_1_FH;
close MATCHED_LINES_FH;
close UNMATCHED_LINES_FH;

# Manual de Ajuda
__END__
=head1 NAME
larry - procura ocorrencias de linhas de um ficheiro no outro.
=head1 SYNOPSIS
larry [options]... [ file]...
 Options:
--file-one=File1
		o primeiro ficheiro.
--file-two=File2
		o segundo ficheiro.
--matched-lines-file=Mached
		ficheiro que ira guardar as linhas encontradas
--unmatched-lines-file=Unmatced
		ficheiro que ira guardas as linhas nao encontradas
--usage
		mostra uma breve ajuda.
--help	
		mostra a ajuda completo.
=head1 OPTIONS
=over 8
=item B<--help>
mostra a ajuda para invocar este script
=item B<--usage>
mostra uma breve discricao do script
=item B<--file-one>
ficheiro qual as suas linhas serao procuradas no B<--file-two>
=item B<--file-two>
ficheiro o qual sera procurado ocorrencias das lindas do B<--file-one>.
=item B<--matched-lines-file>
ficheiro para guardara as linhas de B<--file-one> que existem no B<--file-two>.
=item B<--unmatched-lines-file>
ficheiro que guardara as linhas de B<--file-one> que nao existem no B<--file-two>.
=head1 DESCRIPTION
larry - procura ocorrencias de linhas de um ficheiro no outro
=back
=cut

Editado por eatg75

Victarion seized the dusky woman by the wrist and pulled her to him.

Victarion - She will do it. Go pray to your red god. Light your fire, and tell me what you see.

Moqorro's dark eyes seemed to shine.

Moqorro - I see dragons.

Partilhar esta mensagem


Ligação para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!

Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.

Entrar Agora

×

Aviso Sobre Cookies

Ao usar este site você aceita os nossos Termos de Uso e Política de Privacidade. Este site usa cookies para disponibilizar funcionalidades personalizadas. Para mais informações visite esta página.