[Cascavel-pm] Programa gerar arquivo
Luis Motta Campos
luismottacampos em yahoo.co.uk
Quarta Fevereiro 7 11:14:31 PST 2007
On Feb 7, 2007, at 5:56 PM, Patty Silva wrote:
> Ola Pessoal..
> Alguem pode me dar uma ideia de como eu posso fazer um script em
> perl para ler um arquivo no formato cvs(separados por virgula)
> nesse formato:
> DATA,NOME,FLAG,VARIAVEL
>
> so que quando eu encontrar a FLAG="UL" eu gero um arquivo com os
> dados, ou seja, DATA,NOME,FLAG e VARIAVEL e com nome de DATA.txt
>
> mas a duvida q estou tendo eh.. como vou agrupar os dados e criar
> um arquivo correspondente...
> ex:
> 20070512 00:00:00,PARTICULAR,UL,NOME
> 20070512 00:00:00,PARTICULAR3,UL,NOMEP
> 20070509 00:00:00,PARTICULAR,UL1,NOME
> 20070512 00:00:00,PARTICULAR1,UL,NOME
> 20070512 00:00:00,PARTICULAR,UL4,NOMEP
> 20070509 00:00:00,PARTICULAR2,UL,NOME
> 20070512 00:00:00,PARTICULAR,UL,NOMEC
>
> gerar o arquivo 20070512_00.txt com os dados:
> 20070512 00:00:00,PARTICULAR,UL,NOME
> 20070512 00:00:00,PARTICULAR3,UL,NOMEP
> 20070512 00:00:00,PARTICULAR,UL,NOMEC
>
> gerar o arquivo 20070509_00.txt
> 20070509 00:00:00,PARTICULAR2,UL,NOME
>
>
> Alguem pode me da uma LUZ? :)
>
Parabéns pela quantidade excepcional de detalhes, Patty.
Você está ficando boa em fazer perguntas.
Vamos ver se começa a responder algumas, em breve... ;-)
O que você precisa é de um parser de CSV. Prá variar, o CPAN tem
vários.
Eu escolhi o Class::CSV [http://search.cpan.org/~djr/Class-
CSV-1.02/CSV.pm] para te ajudar com a escrita de volta, é dos poucos
que lê e escreve CSV.
Isso deve resolver seu problema com CSV.
Agora, para separar o conteúdo de acordo com o campo flag, acho
que a melhor saída é usar um hash e uma referência para um array de
objetos do tipo Class::CSV, que vão conter seus campos.
O Data::Dumper representaria a estrutura que eu estou sugerindo
para você mais ou menos assim:
$VAR1 = {
'UL' => [
bless( { data => '20070512 00:00:00',
nome => 'PARTICULAR',
flag => 'UL',
variavel => 'NOME' }, Class::CSV ),
bless( { data => '20070512 00:00:00',
nome => 'PARTICULAR3',
flag => 'UL',
variavel => 'NOMEP' }, Class::CSV ),
bless( { data => '20070512 00:00:00',
nome => 'PARTICULAR1',
flag => 'UL',
variavel => 'NOME' }, Class::CSV ),
bless( { data => '20070509 00:00:00',
nome => 'PARTICULAR2',
flag => 'UL',
variavel => 'NOME' }, Class::CSV )
],
'UL1' => [
bless( { data => '20070509 00:00:00',
nome => 'PARTICULAR2',
flag => 'UL',
variavel => 'NOME' }, Class::CSV )
],
};
Claro, com pouco tempo de trabalho em cima dos manuais do
Class::CSV você vai ver que não precisa muito esforço para construir
isso usando perl. Se você preferir indexar por outro campo (eu acho
que é o seu caso), também é simples, basta usá-lo como chave do hash.
Depois, basta gravar o conteúdo de cada uma das referências de
array (convenientemente re-transformadas em CSV, via Class::CSV) de
volta para o arquivo.
Simples, rápido, profissional e com cara de programa caro. ;-)
Espero que isso ajude.
Putamplexos!
--
Luis Motta Campos is a software engineer,
perl fanatic evangelist, and amateur {cook, photographer}
Mais detalhes sobre a lista de discussão Cascavel-pm