PHP 8.5.0 Alpha 1 available for testing

SplFileObject::fgetcsv

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

SplFileObject::fgetcsvRecupera una línea del archivo y la analiza como datos CSV

Descripción

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

Recupera una línea del archivo y la analiza como datos CSV y devuelve un array que contiene todos los campos leídos.

Nota: Los parámetros de configuración local son tenidos en cuenta por esta función. Por ejemplo, los datos codificados en ciertos juegos de caracteres de un byte pueden ser analizados incorrectamente si LC_CTYPE es en_US.UTF-8.

Parámetros

separator

El delimitador de campo (un solo carácter de un byte). Por omisión, , o el valor definido por una llamada previa a SplFileObject::setCsvControl().

enclosure

El carácter utilizado para encerrar el valor de un campo (un carácter de un solo byte). Por omisión, será una comilla doble o bien el valor definido utilizando el método SplFileObject::setCsvControl().

escape

El carácter de escape de campo (un solo carácter de un byte). Por omisión, " o el valor definido por una llamada previa a SplFileObject::setCsvControl(). Un chaîne de caractères vacío ("") desactiva el mecanismo de escape propietario.

Nota: Normalmente, un carácter enclosure se escapa dentro de un campo duplicándolo; Sin embargo, el carácter escape puede ser utilizado como alternativa. Así, para los valores de parámetro por omisión "" y \" tienen el mismo significado. Además de permitir escapar el carácter enclosure el carácter escape no tiene un significado particular; ni siquiera está destinado a escapar.

Advertencia

A partir de PHP 8.4.0, depender del valor por omisión de escape está deprecado. Debe ser proporcionado explícitamente ya sea por posición, ya sea mediante el uso de los argumentos nombrados, o mediante una llamada a SplFileObject::setCsvControl().

Advertencia

When escape is set to anything other than an empty string ("") it can result in CSV that is not compliant with » RFC 4180 or unable to survive a roundtrip through the PHP CSV functions. The default for escape is "\\" so it is recommended to set it to the empty string explicitly. The default value will change in a future version of PHP, no earlier than PHP 9.0.

Valores devueltos

Devuelve un array indexado que contiene todos los campos leídos, o false si ocurre un error.

Nota:

Una línea vacía de un archivo CSV será devuelta en forma de un array contenido un solo campo null a menos que se utilice SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, en cuyo caso, las líneas vacías serán ignoradas.

Errores/Excepciones

Genera una ValueError si separator o enclosure no tiene una longitud de un byte.

Genera una ValueError si escape no tiene una longitud de un byte o es una cadena vacía.

Historial de cambios

Versión Descripción
8.4.0 Confiar en el valor por omisión de escape está ahora deprecado.
7.4.0 El parámetro escape ahora acepta una cadena de caracteres vacía para desactivar el mecanismo de escape propietario.

Ejemplos

Ejemplo #1 Ejemplo con SplFileObject::fgetcsv()

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

Ejemplo #2 Ejemplo con SplFileObject::READ_CSV

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

Contenido de animals.csv

crocodile,reptile,4
dauphin,mammifère,0
canard,oiseau,2
koala,mammifère,4
saumon,poisson,0

El resultado del ejemplo sería algo similar a:

Un crocodile es un reptile con 4 patas
Un dauphin es un mammifère con 0 patas
Un canard es un oiseau con 2 patas
Un koala es un mammifère con 4 patas
Un saumon es un poisson con 0 patas

Ver también

add a note

User Contributed Notes 6 notes

up
14
android991 at gmail dot com
6 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
5
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
3
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
v-fpiris at teknober dot com
14 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
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
1
jbrauer
5 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