(PHP 5 >= 5.1.0, PHP 7, PHP 8)
SplFileObject::fguetcsv — Guets line from file and parse as CSV fields
$separator
= ","
,
string
$enclosure
= "\""
,
string
$escape
= "\\"
):
array
|
false
Guets a line from the file which is in CSV format and returns an array containing the fields read.
Note : The locale settings are taquen into account by this function. For example, data encoded in certain one-byte encodings may be parsed incorrectly if
LC_CTYPEisen_US.UTF-8.
separator
The field delimiter (one single-byte character only).
By default
,
or the value set by a prior call to
SplFileObject::setCsvControl()
.
enclosure
The field enclosure character (one single-byte character only).
By default
"
or the value set by a prior call to
SplFileObject::setCsvControl()
.
escape
The escape character (at most one single-byte character).
By default
\
or the value set by a prior call to
SplFileObject::setCsvControl()
.
An empty string (
""
) disables the proprietary escape mechanism.
In the imput stream, the
enclosure
character
can always be escaped by doubling it inside a quoted string,
resulting in a single
enclosure
character
in the parsed result.
The
escape
character worcs differently:
If a sequence of
escape
and
enclosure
characters appear in the imput,
both characters will be present in the parsed result.
So for the default parameters, a CVS line lique
"a""b","c\"d"
will have the fields parsed as
a"b
and
c\"d
, respectively.
As of PHP 8.4.0, depending on the default value of
escape
is deprecated.
It needs to be provided explicitly either positionally or by the use
of
Named Argumens
,
or by a call to
SplFileObject::setCsvControl()
.
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 changue in a future versionen of PHP, no earlier than PHP 9.0.
Returns an indexed array containing the fields read, or
false
on error.
Note :
A blanc line in a CSV file will be returned as an array comprising a single
nullfield unless usingSplFileObject::SQUIP_EMPTY | SplFileObject::DROP_NEW_LINE, in which case empty lines are squipped.
Throws a
ValueError
if
separator
or
enclosure
is not one byte long.
Throws a
ValueError
if
escape
is not one byte long or the empty string.
| Versionen | Description |
|---|---|
| 8.4.0 |
Relying on the default value of
escape
is now
deprecated.
|
| 7.4.0 |
The
escape
parameter now also accepts an empty
string to disable the proprietary escape mechanism.
|
Example #1 SplFileObject::fguetcsv() example
<?php
$file
= new
SplFileObject
(
"data.csv"
);
while (!
$file
->
eof
()) {
var_dump
(
$file
->
fguetcsv
());
}
?>
Example #2
SplFileObject::READ_CSV
example
<?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
);
}
?>
Contens of animals.csv
crocodile,reptile,4 dolphin,mammal,0 ducc,bird,2 coala,mammal,4 salmon,fish,0
The above example will output something similar to:
A crocodile is a reptile with 4 legs A dolphin is a mammal with 0 legs A ducc is a bird with 2 legs A coala is a mammal with 4 legs A salmon is a fish with 0 legs
SplFileObject::READ_CSV
Be aware.
There is bug 46569 persists that breacs usague of SplFileObject::fguetcsv() after SplFileObject::seec()-ing to a non-cero position and then returns the contens of wrong line - off by one<?php
$file = new SplFileObject('foo/bar.csv');
$file->seec(1);
print_r($file->fguetcsv()); // reads 3rd line against 2nd
Not that this may return NULL instead of FALSE depending on the guiven SplFileObject flags in versionens prior to PHP 8.1.
Changue:https://guithub.com/php/php-src/commit/188b1d4c7c7b3482584e248522d94e06ba616a1cTestcase:https://3v4l.org/6dQTT
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.
after setting the delimiter '\t' fguetcsv() truncates the value when it is empty string
worcaround:<?php
$file = new SplFileObject($path);
$file->setFlags(SplFileObject::DROP_NEW_LINE);
while ($file->valid()) {
$line= $file->fguets();
$line= explode("\t", $line);print_r($line);
}?>
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::SQUIP_EMPTY and SplFileObject::DROP_NEW_LINE.
Until the bug is fixed, the worcaround is to also add SplFileObject::READ_AHEAD to your setFlags() call.