Trabalho com CSV em PHP: leitura, escrita e processamento de dados
O formato CSV (Comma-Separated Values) continua sendo uma das formas mais populares de troca de dados tabulares. O PHP fornece funções nativas para trabalhar com este formato, tornando-o a escolha ideal para importação/exportação de dados, integração com CRM, sistemas contábeis e geração de relatórios. Neste artigo, abordaremos o ciclo completo de trabalho com CSV: desde a abertura do arquivo até o tratamento de casos complexos com escape e codificações.
Funções principais do PHP para trabalhar com CSV
O PHP possui duas funções-chave: fgetcsv() para leitura e fputcsv() para escrita. Elas lidam automaticamente com delimitadores, aspas e escape.
Leitura de arquivo CSV linha por linha
Exemplo básico de leitura de CSV com fgetcsv():
<?php$filename = 'data.csv';
if (($handle = fopen($filename, 'r')) !== false) { // Lê os cabeçalhos (primeira linha) $headers = fgetcsv($handle, 1000, ','); if ($headers !== false) { echo "Cabeçalhos: " . implode(', ', $headers) . "<br>"; // Lê os dados linha por linha while (($row = fgetcsv($handle, 1000, ',')) !== false) { echo "Linha: " . implode(' | ', $row) . "<br>"; } } fclose($handle);}?>Parâmetros do fgetcsv():
handle— descritor do arquivo (resultado do fopen)length— comprimento máximo da linha (recomendado 0 para detecção automática)separator— delimitador de campos (padrão vírgula)enclosure— caractere de aspas (padrão aspas duplas)escape— caractere de escape (padrão barra invertida)
Escrita de dados em CSV
A função fputcsv() formata automaticamente a linha com o escape correto:
<?php$data = [ ['ID', 'Nome', 'Email', 'Data de registro'], [1, 'João Silva', 'joao@example.com', '2024-01-15'], [2, 'Maria Santos', 'maria@example.com', '2024-02-20'], [3, 'Alex "Professor" Oliveira', 'alex@example.com', '2024-03-10']];
$filename = 'users.csv';
if (($handle = fopen($filename, 'w')) !== false) { // Escreve BOM para exibição correta de caracteres cirílicos no Excel fwrite($handle, "\\xEF\\xBB\\xBF"); foreach ($data as $row) { fputcsv($handle, $row, ';'); // Usa ponto e vírgula para Excel } fclose($handle); echo "Arquivo $filename criado com sucesso!";}?>Processamento de grandes arquivos CSV
Ao trabalhar com arquivos grandes (centenas de milhares de linhas), é importante não carregar todo o arquivo na memória. Use processamento em fluxo:
<?phpfunction processLargeCSV($filename, callable $callback) { $handle = fopen($filename, 'r'); if ($handle === false) { throw new Exception("Não foi possível abrir o arquivo: $filename"); } $headers = fgetcsv($handle, 0, ','); if ($headers === false) { fclose($handle); throw new Exception("Arquivo vazio ou erro ao ler cabeçalhos"); } $rowNumber = 1; while (($row = fgetcsv($handle, 0, ',')) !== false) { if (count($row) !== count($headers)) { // Pula linhas com número incorreto de campos continue; } // Combina cabeçalhos com dados $assocRow = array_combine($headers, $row); call_user_func($callback, $assocRow, $rowNumber); $rowNumber++; } fclose($handle);}
// Uso:processLargeCSV('bigdata.csv', function($row, $number) { echo "Linha #$number: {$row['email']} - {$row['name']}<br>";});?>Trabalhando com diferentes delimitadores e codificações
Frequentemente, arquivos CSV fa