loading...
PHPWomenBR

Manipulação de arquivos csv no PHP

daianealves profile image Daiane Alves Updated on ・5 min read

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 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);

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!

Posted on Jun 15 by:

daianealves profile

Daiane Alves

@daianealves

Information systems student, local community leader PHPRio, PHPWomen, MSP Microsoft.

PHPWomenBR

Nosso objetivo é fornecer uma rede de apoio e orientação às mulheres que querem trabalhar com PHP no Brasil.

Discussion

markdown guide
 

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. ;-)

 

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