[Cascavel-pm] Ideia para solucao de uma problema
Daniel Ruoso
daniel em ruoso.com
Quinta Maio 4 10:52:56 PDT 2006
Em Qui, 2006-05-04 às 08:14 -0300, Patty Silva escreveu:
> Pessoal.. Obrigada pela Ajuda!! :)
> O problema em questao é:
> Como armazenar todos os dados (OS ARQUIVOS .TXT) para gerar um outro
> arquivo com esses dados..
> No caso pegar todos os dados de uma dada data e armazena-los para
> imprimir depois!! :) ou seja pegar o dados do arquivo MARIA.TXT
> JOAO.TXT e armazenar e depois gravar em outro arquivo!! :)
Em primeiro lugar, recomendo usar o Text::xSV... pois ele permite que
você leia o CSV direto do filehandle, utilizando o delimitador que você
quiser, sem precisar trazer o arquivo inteiro para a memória...
Então vc vai passar por todos os arquivos originais, mas para evitar
carregar tudo na memória, você pode abrir vários arquivos ao mesmo
tempo, um para cada data e sair escrevendo neles de acordo com a data...
Como eu mexo com esse tipo de coisa quase sempre, acabei escrevendo
rapidinho um exemplo...
#!/usr/bin/perl -w
use strict; use warnings; use Text::xSV; use Symbol;
my %arqs;
my @files = qw(MARIA.TXT JOAO.TXT); # ou obter usando outro metodo
foreach my $file (@files) {
my $csv = Text::xSV->new();
$csv->open_file($file);
$csv->read_header();
while ($csv->get_row()) {
my ($data) = $csv->extract(qw(data));
$data =~ s/[^a-zA-Z0-9]/_/gs;
my $file = getfile($data,$csv);
print $file $csv->format_row();
}
}
foreach my $file (values %arqs) {
close $file;
}
sub getfile {
my $data = shift;
my $csv = shift;
return $arqs{$data} if exists $arqs{$data};
my $file = gensym();
open $file, '>', $data.'.TXT' or die $!;
print $file $csv->format_header();
$arqs{$data} = $file;
}
Mais detalhes sobre a lista de discussão Cascavel-pm