Trabalhando com CSV em PHP: guia completo
CSV (Comma-Separated Values) — um dos formatos mais populares para troca de dados tabulares. O PHP possui tanto funções nativas para trabalhar com CSV quanto poderosas bibliotecas de terceiros. Neste artigo, abordaremos todas as principais formas de ler, escrever e processar arquivos CSV em PHP.
Funções nativas do PHP para trabalhar com CSV
O PHP oferece várias funções nativas que permitem trabalhar com arquivos CSV sem instalar bibliotecas adicionais. As principais são:
fgetcsv()— lê uma linha de um arquivo e a converte em um arrayfputcsv()— escreve um array em um arquivo no formato CSVstr_getcsv()— converte uma string CSV em um array
Lendo um arquivo CSV com fgetcsv
A função fgetcsv() lê uma linha de um arquivo aberto e a retorna como um array. Exemplo de leitura de um arquivo inteiro:
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { while (($data = fgetcsv($handle, 1000, ',')) !== false) { // $data — array com os dados da linha echo implode(' | ', $data) . ""; } fclose($handle);}?>Parâmetros da função fgetcsv():
handle— descritor do arquivolength— comprimento máximo da linha (geralmente 0 ou 1000)separator— delimitador de campos (padrão é vírgula)enclosure— caractere de encapsulamento de campos (padrão é aspas duplas)escape— caractere de escape (padrão é barra invertida)
Escrevendo dados em um arquivo CSV
Para escrever, usa-se a função fputcsv(). Ela recebe um array e o converte em uma string CSV:
<?php$data = [ ['Nome', 'Idade', 'Cidade'], ['João', 25, 'São Paulo'], ['Maria', 30, 'Rio de Janeiro'],];
$filename = 'output.csv';$handle = fopen($filename, 'w');
foreach ($data as $row) { fputcsv($handle, $row, ';', '"');}
fclose($handle);echo "Arquivo $filename criado com sucesso!";?>Neste exemplo, usamos ponto e vírgula (;) como delimitador, algo comum em arquivos CSV em português.
Processando arquivos CSV grandes
Ao trabalhar com arquivos grandes (centenas de milhares de linhas), é importante não carregar o arquivo inteiro na memória. Use a leitura linha por linha:
<?phpfunction processLargeCSV($filename) { $handle = fopen($filename, 'r'); // Pula o cabeçalho, se existir $header = fgetcsv($handle); while (($row = fgetcsv($handle)) !== false) { // Processa cada linha $processed = array_map('trim', $row); // Sua lógica de processamento aqui yield $processed; // Usa gerador } fclose($handle);}
// Usoforeach (processLargeCSV('bigdata.csv') as $row) { // Trabalha com cada linha individualmente echo "Linha processada: " . implode(',', $row) . "";}?>O uso de geradores (yield) permite processar arquivos de qualquer tamanho sem estourar a memória.
Biblioteca League\\Csv para trabalho avançado
Para tarefas mais complexas, recomenda-se usar a biblioteca league/csv. Ela oferece uma interface orientada a objetos conveniente e muitos recursos adicionais.
Instalação via Composer:
composer require league/csvExemplo de uso:
<?phprequire 'vendor/autoload.php';
use League\\Csv\\Reader;use League\\Csv\\Writer;
// Leitura de CSV$csv = Reader::createFromPath('data.csv', 'r');$csv->setHeaderOffset(0); // Primeira linha é o cabeçalho
// Obtém todos os registros como array associativo Também na biblioteca
Paging 3 para Kotlin: guia completo com exemplos práticos
Cron para Go: guia completo com exemplos práticos
prometheus/client_golang para Go: guia completo com exemplos práticos
Cliente OAuth para TypeScript: integração de autorização em aplicações web