PHP 8.4.0 RC4 available for testing

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 levadas em consideração por esta função. Se LC_CTYPE for, por exemplo, en_US.UTF-8, arquivos em codificações de um byte podem ser lidos incorretamente por esta função.

Parâmetros

separator

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

enclosure

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

escape

O caractere de escape (no máximo um caractere de um byte). Padrão é uma barra invertida (\) ou o valor definido usando 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

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.

Registro de Alterações

Versão Descrição
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
11 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