PHP Conference Nagoya 2025

SplFileObject::fgetcsv

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

SplFileObject::fgetcsvObtiene la línea del archivo y analiza como campos CSV

Descripción

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

Obtiene una línea del archivo que está en formato CSV y devuelve un array que contiene los campos leídos.

Nota:

Esta función tiene en cuenta los ajustes de localización. Si LC_CTYPE es p.e. en_US.UTF-8, los archivos en codificaciones de un byte pueden ser leídos erróneamente por esta función.

Parámetros

delimiter

El delimitador de campo (un solo carácter). El valor por defecto es una coma o el valor establecido usando SplFileObject::setCsvControl().

enclosure

El carácter circundante de cada campo (sólo un carácter). Por omisión, son comillas dobles o el valor establecido por SplFileObject::setCsvControl().

escape

El carácter de escape (a lo sumo un carácter). Por defecto es una barra invertida (\) o el valor establecido usando SplFileObject::setCsvControl(). Un string vacío ("") desactiva el mecanismo de escape propio.

Nota: Normalmente un carácter enclosure se escapa dentro de un campo duplicándolo; sin embargo, el carácter escape puede ser usado como una alternativa. Así que para los valores de parámetros por defecto "" y \" tienen el mismo significado. Aparte de permitir espacar el carácter enclosure el carácter escape no tiene un significado especial; ni siquiera está destinado a escapar de sí mismo.

Valores devueltos

Devuelve un array indexado que contiene los campos que se leen, o false en caso de error.

Nota:

Una línea en blanco en un archivo CSV será devuelto como un array que comprende un único null a menos que se utilice SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, en cuyo caso se saltan las líneas vacías.

Historial de cambios

Versión Descripción
7.4.0 El parámetro escape ahora también acepta un string vacío para desactivar el mecanismo de escape propio.

Ejemplos

Ejemplo #1 Ejemplo de SplFileObject::fgetcsv()

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

Ejemplo #2 Ejemplo 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);
}
?>

El contenido de animals.csv

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

El resultado del ejemplo sería algo similar 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

Ver también

add a note

User Contributed Notes 6 notes

up
13
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
4
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
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
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
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