Manipulação de arquivos csv no PHP
Tags: php, csv, developer, code
Published: 2020-06-15 16:05:48

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

```php
$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:

```php
//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
```php
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:

```php
$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:

```php
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á?

```php
// 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:

```php
$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](https://www.php.net/manual/pt_BR/function.array-multisort.php).

### Organizando preços em ordem decrescente

Você também pode ordenar os preços utilizando a função `array_multisort()`.

Veja o exemplo:

```php
$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](https://www.php.net/manual/pt_BR/function.fgetcsv.php).
Veja o exemplo:

```php
$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!