PHP 8.4.1 Released!

SplFileObject::fgetcsv

(PHP 5 >= 5.1.0, PHP 7, PHP 8)

SplFileObject::fgetcsvObtém linha do arquivo e interpreta como campos CSV

Descrição

public SplFileObject::fgetcsv(string $separator = ",", string $enclosure = "\"", string $escape = "\\"): array|false

Obtém uma linha do arquivo no formato CSV e retorna um array contendo os campos lidos.

Nota: As configurações de localidade são consideradas por esta função. Por exemplo, dados em certas codificações de um byte podem ser interpretados incorretamente se LC_CTYPE for en_US.UTF-8.

Parâmetros

separator

O delimitador de campo (apenas um caractere de um byte). Padrão é uma vírgula (,) ou o valor definido por uma chamada anterior a SplFileObject::setCsvControl().

enclosure

O caractere de delimitador de campo (apenas um caractere de um byte). Padrão é uma aspa dupla (") ou o valor definido por uma chamada anterior a SplFileObject::setCsvControl().

escape

O caractere de escape (no máximo um caractere de um byte). Padrão é uma barra invertida (\) ou o valor definido por uma chamada anterior a SplFileObject::setCsvControl(). Uma string vazia ("") desativa o mecanismo de escape proprietário.

Nota: Geralmente, um caractere de enclosure é escapado dentro de um campo duplicando-o; no entanto, o caractere de escape pode ser usado como alternativa. Assim, para os valores padrão dos parâmetros "" e \" têm o mesmo significado. Além de permitir escapar o caractere de enclosure, o caractere de escape não tem significado especial; nem mesmo é destinado a escapar a si mesmo.

Aviso

A partir do PHP 8.4.0, depender do valor padrão de escape foi descontinuado. Ele precisa ser fornecido explicitamente tanto por posição quanto pelo uso de argumentos nomeados, ou por uma chamada a SplFileObject::setCsvControl().

Aviso

Quando o parâmetro escape for definido para algo diferente de uma string vazia (""), isso pode resultar em um CSV que não esteja conforme a » RFC 4180 ou que não seja capaz de sobreviver a uma viagem de ida e volta através das funções CSV do PHP. O padrão para escape é "\\", portanto é recomendado defini-lo explicitamente para a string vazia. O valor padrão será alterado em uma versão futura do PHP, mas não antes do PHP 9.0.

Valor Retornado

Retorna um array indexado contendo os campos lidos, ou false em caso de erro.

Nota:

Uma linha em branco em um arquivo CSV será retornada como um array composto por um único campo null a menos que esteja usando SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, caso em que as linhas em branco são ignoradas.

Erros/Exceções

Lança uma ValueError se separator ou enclosure não tiver comprimento de um byte.

Lança uma ValueError se escape não tiver comprimento de um byte ou se for uma string vazia.

Registro de Alterações

Versão Descrição
8.4.0 Depender do valor padrão de escape agora está descontinuado.
7.4.0 O parâmetro escape agora também aceita uma string vazia para desativar o mecanismo de escape proprietário.

Exemplos

Exemplo #1 Exemplo de SplFileObject::fgetcsv()

<?php
$file
= new SplFileObject("data.csv");
while (!
$file->eof()) {
var_dump($file->fgetcsv());
}
?>

Exemplo #2 Exemplo de SplFileObject::READ_CSV

<?php
$file
= new SplFileObject("animals.csv");
$file->setFlags(SplFileObject::READ_CSV);
foreach (
$file as $row) {
list(
$animal, $class, $legs) = $row;
printf("A %s is a %s with %d legs\n", $animal, $class, $legs);
}
?>

Conteúdo de animals.csv

crocodile,reptile,4
dolphin,mammal,0
duck,bird,2
koala,mammal,4
salmon,fish,0

O exemplo acima produzirá algo semelhante a:

A crocodile is a reptile with 4 legs
A dolphin is a mammal with 0 legs
A duck is a bird with 2 legs
A koala is a mammal with 4 legs
A salmon is a fish with 0 legs

Veja Também

adicione uma nota

Notas Enviadas por Usuários (em inglês) 6 notes

up
10
android991 at gmail dot com
5 years ago
Be aware.
There is bug 46569 persists that breaks usage of SplFileObject::fgetcsv() after SplFileObject::seek()-ing to a non-zero position and then returns the contents of wrong line - off by one
<?php
$file
= new SplFileObject('foo/bar.csv');
$file->seek(1);
print_r($file->fgetcsv()); // reads 3rd line against 2nd
up
3
v-fpiris at teknober dot com
13 years ago
after setting the delimiter '\t' fgetcsv() truncates the value when it is empty string

workaround:

<?php
$file
= new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);
while (
$file->valid()) {
$line = $file->fgets();
$line = explode("\t", $line);

print_r($line);
}
?>
up
2
Denitz
6 years ago
If your CSV doesn't have enclosures, you can face an issue with default " identified as enclosure in data. Empty $enclosure is not allowed, but you can use same $enclosure as $delimiter (\n by default) to emulate empty enclosure.
up
2
vaughn dot clayton+php at servicetrade dot com
12 years ago
Note that due to bugs 55807 and 61032, introduced in 5.3.8, if the csv in example #2 has a newline character at the end of each line, the foreach will execute 6 times.

The last time through the loop $row will be bool(false). This is true even if using SplFileObject::SKIP_EMPTY and SplFileObject::DROP_NEW_LINE.

Until the bug is fixed, the workaround is to also add SplFileObject::READ_AHEAD to your setFlags() call.
up
2
InvisibleSmiley
3 years ago
Not that this may return NULL instead of FALSE depending on the given SplFileObject flags in versions prior to PHP 8.1.

Change: https://github.com/php/php-src/commit/188b1d4c7c7b3482584e248522d94e06ba616a1c

Testcase: https://3v4l.org/6dQTT
up
1
jbrauer
4 years ago
Also while the enclosure character cannot be NULL you can set it to ASCII NUL character chr(0) with the same practical effect.
To Top