Manipulando arquivos CSV usando Perl

No CPAN podemos encontrar vários módulos prontos para lidar com arquivos CSV, mas a forma mais simples que eu conheço é utilizando o módulo Text::CSV.

Ele é um wrapper através do qual você pode selecionar backends compatívies como o Text::CSV_PP, escrito inteiramente em Perl ou a sua encarnação turbinada o Text::CSV_XS, escrita em linguagem C.

Os exemplos completos desse post podem ser encontrados no repositório de exemplos do blog.

Criando um arquivo CSV a partir de um conjunto de dados

O código completo para criar um arquivo CSV a partir de um conjunto de dados é mostrado abaixo:

#!/usr/bin/env perl

use v5.30;
use strict;
use warnings;

use Text::CSV qw( csv );

my $data = [
{ 'name' => 'Fulana de Tal', 'pronoun' => 'Sra.', 'age' => 35, },
{ 'name' => 'Beltrano da Silva', 'pronoun' => 'Sr.', 'age' => 24, },
{ 'name' => 'Ciclano Augusto', 'pronoun' => undef, 'age' => 42, },
];

csv( 'in' => $data, 'out' => 'data.csv' );

A nossa estrutura de dados consiste em um conjunto de linhas, cada uma com três colunas contendo o nome o pronome de tratamento e a idade de pessoas.

Para criar um arquivo com esses dados, basta chamar a função csv() passando como parâmetro de entrada in um array de hashes* e como parâmetro de saída out o nome do arquivo desejado.

Simples assim.

Importando um arquivo para uma estrutura de dados

Analogamente, para ler o conteúdo de um arquivo CSV e colocá-lo numa estrutura de dados, podemos utilizar o seguinte código:

#!/usr/bin/env perl

use v5.30;
use strict;
use warnings;

use Text::CSV qw( csv );

my $data = csv( 'in' => 'data.csv', 'headers' => 'auto' );

foreach my $row ( $data->@* ) {
my $greetings =
!!$row->{'pronoun'}
? "Olá $row->{'pronoun'} $row->{'name'}!!!"
: "Ei $row->{'name'}!!!";

say $greetings;
}

Utilizaremos a mesma função csv(), só que agora passando como parâmetro de entrada in o nome do arquivo, além do parâmetro headers que indica para a função utilizar a primeira linha como cabeçalho.

A variável $data será um array de hashes contendo os dados do arquivo.

Pronto. Só isso.

No exemplo, acrescentamos um laço de repetição foreach apenas para mostrar os dados lidos.

Comentários adicionais

Os módulos Text::CSV e Text::CSV_XS possuem muito mais opções do que mostradas aqui. Este código é apenas a forma mais curta que eu encontrei pra ler e gravar arquivos CSV. Uma boa ideia é explorar a boa documentação de ambos.

Note, que o módulo sabe se virar sozinho quando alguma das "células" está "vazia", como é o caso do pronome do "Ciclano Augusto" no exemplo.

* Tecnicamente eu deveria dizer ArrayRef de HashRefs, mas é mais fácil de explicar usando os termos mais simples que eu citei.