Manipulação de arquivos csv
com PHP
O formato csv
é um tipo de arquivo de texto bastante utilizado para transferência de informações entre diferentes aplicações e também para geração de relatório.
E para fazer esse tipo de troca de informações com sucesso, você precisa saber como manipular esses arquivos.
Em linhas gerais, o csv
é um formato usado para armazenar dados e que pode ser lido em programas que trabalham com planilhas.
O que é csv
?
Mas, antes de trabalhar com arquivos csv
no PHP, é importante entender em que consiste essa sigla. Por definição, csv
é um formato de arquivo que significa “comma-separated-values” (valores separados por vírgulas), ou seja,os campos de dados indicados neste formato normalmente são separados ou delimitados por uma vírgula.
Para entender de uma forma mais prática, vamos supor que você tenha uma planilha que contenha os dados a seguir:
Daiane | daiane@teste.com | 912345678 |
---|---|---|
Adriele | drica@teste.com | 987654321 |
Livia | livia@teste.com | 876543456 |
Bruna | bruna@teste.com | 998765678 |
Esses dados poderiam ser lidos em um arquivo csv
separados por vírgulas e por um espaçamento de linha, como no exemplo a seguir:
Daiane,daiane@teste.com,912345678
Adriele,drica@teste.com,987654321
Livia,livia@teste.com,876543456
Bruna,bruna@teste.com,998765678
Agora que você já entendeu o conceito básico sobre csv
, vamos aprender como podemos utilizar o PHP para fazer a manipulação desses arquivos.
OBS: CSV é separado por vírgula e não ponto e vírgula.
Abrindo um arquivo csv
existente
A função fopen()
pode ser utilizada tanto para abrir um arquivo quanto para criar um novo.
Neste exemplo, vamos mostrar como abrir um arquivo existente. A função fopen()
recebe dois argumentos, o primeiro argumento recebe o nome do arquivo que deseja abrir e no segundo argumento o tipo de permissão(leitura, escrita, leitura e escrita...).
$arquivo = fopen('nomeArquivo.csv', 'w');
Criando um arquivo csv
Podemos também utilizar a função fopen()
para criar nosso arquivo .csv
.
Veja o exemplo:
//Abrir ou criar arquivo
$arquivo = fopen('file.csv', 'w');
Ao executar esta função é criado automaticamente um arquivo vazio (com permissão de escrita, neste caso).
Nota: a função
fopen()
pode ser utilizada para criar qualquer tipo de arquivo, basta colocar a extensão que deseja. Exemplo:arquivo.txt
,arquivo.pdf
,arquivo.xls
.
Inserindo dados no arquivo csv
Existem algumas maneiras de inserir dados em um arquivo csv
, uma delas é abrir o próprio arquivo e inserir os dados manualmente separados por vírgula. Mas, não é isso que iremos aprender...
Vamos usar nosso bom e velho amigo PHP para isso!
Para isso podemos utilizar a função fputcsv()
. Ela formata uma linha (passada como um array de campos fields)
como CSV
e a escreve (terminando com uma nova linha) no manipulador de arquivo especificado por handle
.
Sintaxe
fputcsv($handle, $fields, $delimiter, $enclosure, $escape_char);
Parâmetros
-
$handle
- O ponteiro de arquivo precisa ser válido, e apontar para um arquivo aberto porfopen()
(e ainda não fechado porfclose()
). -
$fields
- Um array de valores. -
$delimiter
- O parâmetro opcional delimiter configura o caractere delimitador (apenas um caractere). O padrão é vírgula. -
$enclosure
- O parâmetro opcional enclosure configura o caractere que envolve os dados (apenas um caractere). O padrão é aspas, utilizado quando se tem quebra de linha ou vírgulas dentro do texto. -
$escape_char
- O parâmetro opcional escape_char configura o caractere de escape (apenas um caractere). Utilizado para fazer o escape de uma aspa no meio de uma string.
Veja o exemplo abaixo:
$dados = [
[
'produto' => 'Notebook',
'preco' => 3587,
],
[
'produto' => 'Celular',
'preco' => 2643,
],
[
'produto' => 'TV',
'preco' => 5876,
],
[
'produto' => 'Fone',
'preco' => 432,
],
];
// Abrir/criar arquivo
$arquivo = fopen('file.csv', 'w');
// Popular os dados
foreach ($dados as $linha) {
fputcsv($arquivo, $linha);
}
// Fechar o arquivo
fclose($arquivo);
Neste exemplo começamos nosso arquivo criando um array que contém produtos e preços.
Em seguida, criamos a variável $arquivo
que está recebendo a função fopen()
para criar um novo arquivo.
Depois criamos um foreach
para percorrer nosso array e usamos a função fputcsv()
para gerar o output do csv
.
E por último usamos a função fclose()
para fechar o arquivo.
Ao executar este código teremos como saída:
Notebook,3587
Celular,2643
TV,5876
Fone,432
Criando cabeçalho
O exemplo acima é bem útil, mas está faltando algo... Precisamos criar cabeçalhos pra nossa tabela final ficar mais intuitiva. Vamos lá?
// Cabeçalho do csv
$headers = ['Produto', 'Preço'];
$dados = [
[
'produto' => 'Notebook',
'preco' => 3587,
],
[
'produto' => 'Celular',
'preco' => 2643,
],
[
'produto' => 'TV',
'preco' => 5876,
],
[
'produto' => 'Fone',
'preco' => 432,
],
];
$arquivo = fopen('file.csv', 'w');
// Criar o cabeçalho
fputcsv($arquivo , $headers);
foreach ($dados as $linha ) {
fputcsv($arquivo, $linha);
}
fclose($arquivo);
Manipulando os dados
Imagine que você necessite colocar os produtos em ordem alfabética. Podemos utilizar a função array_multisort()
.
Veja o exemplo:
$headers = ['Produto', 'Preço'];
$dados = [
[
'produto' => 'Notebook',
'preco' => 3587,
],
[
'produto' => 'Celular',
'preco' => 2643,
],
[
'produto' => 'TV',
'preco' => 5876,
],
[
'produto' => 'Fone',
'preco' => 432,
],
];
$arquivo = fopen('file.csv', 'w');
fputcsv($arquivo , $headers);
foreach ($dados as $chave => $valor) {
$produto[$chave] = $valor['produto'];
$preco[$chave] = $valor['preco'];
}
// Ordenar array dados na coluna produto em ordem crescente.
// Pode usar SORT_DESC para ordem decrescente.
array_multisort($produto, SORT_ASC, $dados);
foreach ($dados as $linha ){
fputcsv($arquivo, $linha);
}
fclose($arquivo);
Aqui nós utilizamos a função array_multisort()
para fazer a ordenação do nosso array. Para saber mais, consulte o manual do PHP.
Organizando preços em ordem decrescente
Você também pode ordenar os preços utilizando a função array_multisort()
.
Veja o exemplo:
$headers = ['Produto', 'Preço'];
$dados = [
[
'produto' => 'Notebook',
'preco' => 3587,
],
[
'produto' => 'Celular',
'preco' => 2643,
],
[
'produto' => 'TV',
'preco' => 5876,
],
[
'produto' => 'Fone',
'preco' => 432,
],
];
$arquivo = fopen('file.csv', 'w');
fputcsv($arquivo , $headers);
foreach ($dados as $chave => $valor) {
$produto[$chave] = $valor['produto'];
$preco[$chave] = $valor['preco'];
}
// SORT_ASC para ordem crescente
array_multisort($preco, SORT_ASC, $dados);
foreach ($dados as $linha) {
fputcsv($arquivo, $linha);
}
fclose($arquivo);
OBS: fclose em muitos casos se faz desnecessário pois o PHP já fecha automaticamente quando encerra a execução de um script. É bom fechar mais para reduzir consumo de memória em scripts que fazem muita coisa como manipulação de muitos CSV.
Lendo um arquivo csv
existente
No exemplo anterior, vimos que é possível criar e manipular arquivos csv
no PHP, agora vamos trabalhar com arquivos csv
já existentes. Para isso vamos utilizar a função fgetcsv()
.
A função fgetcsv()
interpreta a linha em busca de campos no formato csv
e retorna um array contendo os campos lidos. Para conhecer um pouco mais sobre ela, acesse o manual do PHP.
Veja o exemplo:
$handle = fopen("nota.csv", "r");
$header = fgetcsv($handle, 1000, ",");
while ($row = fgetcsv($handle, 1000, ",")) {
$nota[] = array_combine($header, $row);
}
print_r($nota);
fclose($handle);
Executando esse código teríamos como saída:
Array
(
[0] => Array
(
[N°da Nota Fiscal] => 87
[Data da Emissão] => 31/05/2020
[Hora da Emissão] => 14:27:25
[Valor] => 23764,40
)
[1] => Array
(
[N°da Nota Fiscal] => 86
[Data da Emissão] => 27/05/2020
[Hora da Emissão] => 14:25:00
[Valor] => 549873,0
)
[2] => Array
(
[N°da Nota Fiscal] => 85
[Data da Emissão] => 27/05/2020
[Hora da Emissão] => 14:03:41
[Valor] => 25876
)
[3] => Array
(
[N°da Nota Fiscal] => 84
[Data da Emissão] => 18/05/2020
[Hora da Emissão] => 16:55:43
[Valor] => 150000
)
)
E a partir daí você pode trabalhar com este arquivo da maneira que desejar.
Esperamos que tenha curtido e bons estudos!
Top comments (7)
Eu não conhecia a função array_multisort. Interessante, porém confusa, né!?
rsrsrs
Num primeiro momento sim, mas o resultado que ela traz é pra mim foi bem útil. ;-)
Excelente conteúdo! Já vi várias explicações do assunto mas essa foi a mais descritiva.
Parabéns pelo artigo! Me ajudou bastante!
Meu uso csv constantemente E não conheci as funções para get e put de csv. Bem legal!
Que ótimo que curtiu, Paulo. S2
Como remover doble quote de valor string com mais de um valor? Por exemplo: "Computador DELL"