DEV Community

Daiane Alves for PHPWomenBR

Posted on • Edited on

Manipulação de arquivos csv no PHP

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');
Enter fullscreen mode Exit fullscreen mode

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');
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode
Parâmetros
  • $handle - O ponteiro de arquivo precisa ser válido, e apontar para um arquivo aberto por fopen() (e ainda não fechado por fclose()).
  • $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);
Enter fullscreen mode Exit fullscreen mode

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
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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);
Enter fullscreen mode Exit fullscreen mode

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
        )

)
Enter fullscreen mode Exit fullscreen mode

E a partir daí você pode trabalhar com este arquivo da maneira que desejar.
Esperamos que tenha curtido e bons estudos!

Top comments (7)

Collapse
 
cviniciussdias profile image
Vinicius Dias

Eu não conhecia a função array_multisort. Interessante, porém confusa, né!?
rsrsrs

Collapse
 
daianealves profile image
Daiane Alves

Num primeiro momento sim, mas o resultado que ela traz é pra mim foi bem útil. ;-)

Collapse
 
thomasmoraes02 profile image
Thomas Moraes

Excelente conteúdo! Já vi várias explicações do assunto mas essa foi a mais descritiva.

Collapse
 
thiagoluna profile image
Thiago Luna

Parabéns pelo artigo! Me ajudou bastante!

Collapse
 
paulosouzainfo profile image
PauloSouza.info

Meu uso csv constantemente E não conheci as funções para get e put de csv. Bem legal!

Collapse
 
daianealves profile image
Daiane Alves

Que ótimo que curtiu, Paulo. S2

Collapse
 
mdanieldiasit profile image
Marcos Daniel Dias

Como remover doble quote de valor string com mais de um valor? Por exemplo: "Computador DELL"