1

Str getcsv: примеры (PHP)

Разбор CSV строк в PHP с помощью функции str_getcsv
Раздел: Работа со строками
str_getcsv(string string [, string separator [, string enclosure [, string escape]]]): array

Описание функции str_getcsv

Функция str_getcsv() в PHP разбирает строку в формате CSV и возвращает массив, содержащий поля, считанные из строки. Она часто применяется для обработки данных, полученных из CSV-файлов или текстовых источников, когда нужно разобрать строку без чтения из файла.

Аргументы функции
  • string $string (обязательный): Входная строка для разбора в CSV-формате.
  • string $separator = ',': Разделитель полей (один символ). По умолчанию запятая.
  • string $enclosure = '"': Символ ограничителя полей (один символ). По умолчанию двойная кавычка.
  • string $escape = '\\': Экранирующий символ (один символ). По умолчанию обратный слеш (\\). В PHP 8.0.0 по умолчанию используется символ \\" (если не указан).
  • string $eol = NULL (добавлен в PHP 8.1.0): Символ конца строки. Если задан, функция будет использовать его для разделения строк, а не разбирать всю строку как одну запись. По умолчанию NULL.

Короткие примеры использования

Пример 1: Базовое использование
$csvString = "яблоко,апельсин,банан";
$result = str_getcsv($csvString);
print_r($result);
Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => банан
)
Пример 2: Использование другого разделителя
$csvString = "яблоко;апельсин;банан";
$result = str_getcsv($csvString, ';');
print_r($result);
Array
(
    [0] => яблоко
    [1] => апельсин
    [2] => банан
)
Пример 3: Работа с кавычками и пробелами
$csvString = '"Красное яблоко", "Желтый банан"';
$result = str_getcsv($csvString);
print_r($result);
Array
(
    [0] => Красное яблоко
    [1] =>  Желтый банан
)
Пример 4: Использование аргумента $eol (PHP 8.1+)
$csvString = "яблоко,1\nапельсин,2";
$result = str_getcsv($csvString, separator: ',', eol: "\n");
print_r($result);
Array
(
    [0] => Array
        (
            [0] => яблоко
            [1] => 1
        )
    [1] => Array
        (
            [0] => апельсин
            [1] => 2
        )
)

Похожие функции в PHP

fgetcsv() — считывает строку из файлового указателя и разбирает её как CSV. Используется при работе с файлами.

SplFileObject::fgetcsv() — метод объекта SplFileObject для чтения CSV. Предоставляет объектно-ориентированный интерфейс.

csv_parse() (из расширения libcsv) — альтернативная функция для разбора CSV, но не входит в стандартную поставку PHP.

Когда использовать str_getcsv: Когда CSV-данные уже находятся в строковой переменной, а не в файле. Это удобно для обработки данных из сетевых запросов или баз данных.

Типичные ошибки

Ошибка 1: Неправильный учет кавычек
$csvString = '"яблоко,сорт1",банан';
$result = str_getcsv($csvString);
print_r($result); // Правильно
Array
(
    [0] => яблоко,сорт1
    [1] => банан
)

Ошибкой было бы использовать простой split(',') для такой строки.

Ошибка 2: Несоответствие разделителя
$csvString = "яблоко;апельсин";
$result = str_getcsv($csvString); // Используется разделитель по умолчанию ','
print_r($result);
Array
(
    [0] => яблоко;апельсин
)

Массив содержит один элемент, так как запятая в строке отсутствует.

Ошибка 3: Проблемы с экранированием в старых версиях PHP
// В PHP 7
$csvString = '"яблоко\"сладкое",банан';
$result = str_getcsv($csvString, ',', '"', '\\');
print_r($result);

В PHP 8.0+ экранирование по умолчанию изменилось, что может привести к разным результатам.

Изменения в последних версиях PHP

  • PHP 8.0.0: Аргумент $escape теперь по умолчанию имеет значение '\"' (символ экранирования как часть enclosure), а не '\\'. Это изменение соответствует стандарту RFC 4180.
  • PHP 8.1.0: Добавлен необязательный параметр $eol. Он позволяет разбивать строку на несколько записей CSV по указанному символу конца строки, возвращая массив массивов.
  • PHP 8.2.0: Изменений, специфичных для str_getcsv, не было.

Расширенные примеры использования

Пример 1: Обработка строки с переносами и аргументом eol
Пример php
$csvData = "\"Название\",\"Цена\"\n\"Яблоко\",100\n\"Апельсин\",200";
$lines = str_getcsv($csvData, ',', '"', '\"', "\n");
foreach ($lines as $line) {
    print_r($line);
}
Array
(
    [0] => Название
    [1] => Цена
)
Array
(
    [0] => Яблоко
    [1] => 100
)
Array
(
    [0] => Апельсин
    [1] => 200
)
Пример 2: Использование escape-символа
Пример php
// PHP 8.0+ с escape по умолчанию '\"'
$csvString = '"яблоко\"сорт1",банан';
$result = str_getcsv($csvString);
print_r($result);
Array
(
    [0] => яблоко"сорт1
    [1] => банан
)
Пример 3: Разбор строки с табуляцией в качестве разделителя
Пример php
$csvString = "яблоко\t10\tкрасное";
$result = str_getcsv($csvString, "\t");
print_r($result);
Array
(
    [0] => яблоко
    [1] => 10
    [2] => красное
)
Пример 4: Обработка пустых полей
Пример php
$csvString = "яблоко,,банан,"Яблоко, Голден",";
$result = str_getcsv($csvString);
print_r($result);
Array
(
    [0] => яблоко
    [1] =>
    [2] => банан
    [3] =>
    [4] => Яблоко, Голден
    [5] =>
)

Аналоги функции в других языках

Str getcsv в Python

import csv
csv_string = 'яблоко,апельсин,банан'
reader = csv.reader(csv_string.splitlines())
for row in reader:
    print(row)
['яблоко', 'апельсин', 'банан']

В Python обычно используется модуль csv, который более гибкий и требует итерации по reader. Для простой строки можно использовать split(','), но это не учитывает кавычки.

Str getcsv в Javascript

let csvString = 'яблоко,апельсин,банан';
let result = csvString.split(',');
console.log(result);
['яблоко', 'апельсин', 'банан']

В JavaScript нет встроенной функции для разбора CSV, но можно использовать split. Для сложных случаев применяют библиотеки или ручной разбор.

Str getcsv в MySQL

-- Использование LOAD DATA INFILE для импорта CSV-файла
LOAD DATA INFILE 'data.csv'
INTO TABLE table_name
FIELDS TERMINATED BY ','
ENCLOSED BY '"'
LINES TERMINATED BY '\n';

MySQL работает с CSV-файлами через команду LOAD DATA INFILE или импорт. Прямого аналога str_getcsv нет, так как язык ориентирован на работу с БД.

PHP str_getcsv function comments

En
Str getcsv Parse a CSV string into an array