[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