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 2ndSplFileObject::fgetcsv
Почист и полокален преглед на PHP референцата, со задржана структура од PHP.net и подобра читливост за примери, секции и белешки.
SplFileObject::fgetcsv
Референца за `splfileobject.fgetcsv.php` со подобрена типографија и навигација.
SplFileObject::fgetcsv
(PHP 5 >= 5.1.0, PHP 7, PHP 8)
SplFileObject::fgetcsv — Зема ред од датотека и го парсира како CSV полиња
= NULL
$separator = ",", string $enclosure = "\"", string $escape = "\\"): array|falseЗема ред од датотеката што е во CSV формат и враќа низа што ги содржи прочитаните полиња.
Забелешка: Поставките за локалот се земени предвид од оваа функција. На пример, податоците кодирани во одредени еднобајтни кодови може да се парсираат погрешно ако
LC_CTYPEisen_US.UTF-8.
Параметри
separator-
Низа од вредности.
,Ограничувач на полето (само еден еднобајтен знак). Стандардно SplFileObject::fputcsv(). enclosure-
или вредноста поставена со претходен повик до
"Ограничувач на полето (само еден еднобајтен знак). Стандардно SplFileObject::fputcsv(). escape-
Затворач на полето (само еден еднобајтен знак). Стандардно
\Ограничувач на полето (само еден еднобајтен знак). Стандардно SplFileObject::fputcsv()Знак за бегство (најмногу еден еднобајтен знак). Стандардно"") го оневозможува патентираниот механизам за бегство.Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваВо влезната струја,
enclosureзнакот секогаш може да се избегне со удвојување во заградена низа, што резултира со еденenclosureзнак во парсираниот резултат. Наescapeзнак работи поинаку: Ако се појави низа одescapeandenclosureзнаци во влезот, двата знака ќе бидат присутни во парсираниот резултат. Значи, за стандардните параметри, CSV ред како"a""b","c\"d"ќе ги има полињата анализирани какоa"bandc\"d, соодветно.Ги ескејпува специјалните знаци во стринг за употреба во SQL изјаваОд PHP 8.4.0, во зависност од стандардната вредност на
escapeе застарено. Треба да се обезбеди експлицитно или позиционо или со користење на . Празен стринг (Именувани аргументи SplFileObject::fputcsv().
Кога escape е поставено на нешто различно од празен стринг ("") може да резултира со CSV што не е во согласност со
параметри поставува прилагодена секвенца за крај на линијата. или не може да преживее враќање низ CSV функциите на PHP. Стандардното за escape is
"\\" затоа се препорачува експлицитно да се постави на празен стринг. Стандардната вредност ќе се промени во идна верзија на PHP, не порано од PHP 9.0.
Вратени вредности
Враќа индексиран список што ги содржи прочитаните полиња, или false при грешка.
Забелешка:
Празен ред во CSV датотека ќе се врати како низ што се состои од еден
nullполе освен ако не се користиSplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE, во кој случај празните редови се прескокнуваат.
Errors/Exceptions
Фрла ValueError if
separator or enclosure
не е долг еден бајт.
Фрла ValueError if
escape не е долг еден бајт или е празен стринг.
Дневник на промени
| Верзија | = NULL |
|---|---|
| 8.4.0 |
Ослонувањето на стандардната вредност на escape не е валидна опција
|
| 7.4.0 |
На escape параметарот сега прифаќа и празен стринг за да го оневозможи сопствениот механизам за бегство.
|
Примери
Пример #1 - Добива линија од датотечен покажувач и парсира за CSV полиња example
<?php
$file = new SplFileObject("data.csv");
while (!$file->eof()) {
var_dump($file->fgetcsv());
}
?>
Пример #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);
}
?>Содржина на animals.csv
crocodile,reptile,4 dolphin,mammal,0 duck,bird,2 koala,mammal,4 salmon,fish,0
Горниот пример ќе прикаже нешто слично на:
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
Види Исто така
- SplFileObject::fgetcsv() - Запиши низа од полиња како CSV ред
- SplFileObject::fputcsv() - Постави го разделувачот, затворачот и знакот за бегство за CSV
- SplFileObject::setCsvControl() - Земи го разделувачот, затворачот и знакот за бегство за CSV
- SplFileObject::setFlags() - Поставува знаменца за SplFileObject
SplFileObject::READ_CSV- до имплементација на - Преземање на тековниот ред од датотеката
- fputcsv() - Форматирај ред како CSV и запиши во покажувач на датотека
- fgetcsv() Горниот пример ќе го напише следново на
- str_getcsv() - Анализирај CSV стринг во низ
Белешки од корисници 6 белешки
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/6dQTTIf 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' 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);
}
?>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.