[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