/ php

Чтение CSV-файла в PHP

В этой статье я покажу простой пример того, как прочитать данные их CSV-файла, и записать их в массив для дальнейшей работы с данными. Мы напишем простой код по парсингу CSV на PHP, которую можно будет использовать конвертации CSV-данных в массив, или JSON.

Прежде всего, разберёмся, что за формата такой этот CSV. Это формат хранения данных в текстовом документе, где каждая запись записывается с новой строки, в которой все значения разделены запятой (отсюда и имеем название формата - Comma Separated Values).

Итогово, CSV-формат состоит из переносов на новую строку и запятых, и это всё, что вам нужно знать.

Формата записи CSV можно увидеть на примере:

ID,Login,Age
1,User1,18 // одна запись
2,User2,19 // новая запись
3,User3,20 // и ещё одна

На примере, первая колонка - это ID пользователя, вторая - логин, и последняя - возраст пользователя. Как можете видеть, каждый пользователь отделён переносом на новую строку.

Зная своего врага в лицо Понимая, что это обычная строка, мы уже можем распарсить CSV, используя PHP функции для работы со строкой. Забегая наперёд, скажу, что в PHP есть встроенные средства по парсингу CSV (её мы рассмотрим дальше, сравнивая 2 разных подхода).

Потому, для полного понимания, как происходит чтение CSV файла построчно, напишем код, без использования встроенных решений парсинга CSV на PHP:

$file = __DIR__ . '/example.csv';
// читаем содержимое файла, формируем массив данных, к каждому элементу массива применяем функцию trim (для удаления лишних пробелов)
$rows = array_map('trim', file($file));
// удаляем первую строку названия полей ID,Login,Age
array_shift($rows);

foreach ($rows as $index => $row) {
    // теперь строку вида 1,User1,18 разделяем по запятой, удаляя лишние пробелы
    $params = array_map('trim', explode(',', $row));

    $id = $params[0];
    $login = $params[1];
    $age = $params[2];

    // или же, короче
    list($id, $login, $age) = $params;
}

И теперь, на просмотерв этот код, вы знаете, как читать CSV файлы на PHP, используя обычные функции работы со строкой.

Парсинг CSV на примере встроенной функции fgetcsv

В PHP есть встроенная функция fgetcsv, которая облегчает работу по парсингу CSV-файлов. Эта функция избавляет нас от лишней работы, от "низкоуровневого" парсинга строки. Эта функция автоматически распарсит CSV поля и строки, сохраняя данные в массив.

Перепишем код, написанный ранее, используя функцию fgetcsv:

$file = __DIR__ . '/example.csv';
//открываем файл с CSV-данными
$fh = fopen($file, "r");

// делаем пропуск первой строки, смещая указатель на одну строку
fgetcsv($fh, 0, ',');
//читаем построчно содержимое CSV-файла
while (($row = fgetcsv($fh, 0, ',')) !== false) {
    $id = $row[0];
    $login = $row[1];
    $age = $row[2];

    // или же, короче
    list($id, $login, $age) = $row;
}

Когда вы запустите этот код, вы сможете увидеть, что в переменной $row находится массив, содержащий данные каждой из колонок. И любое значение можно будет получить, работая как с обычным массивом, получая элемент по его соответствующему индексу.

Рассматривая на примере моих исходных данных, каждая строка CSV-данных имеет 3 колонки, данные из которых можно прочитать, вызвав: $row[0], $row[1], $row[2].

Так же, можете заметить, что функция fgetcsv облегчила нам работу, выполняя всю чёрную работу по парсингу самостоятельно (в отличии от варианта, который рассматривался вначале).

Преобразование CSV в массив

Теперь, понимая, как парсить CSV, покажу код преобразования CSV в ассоциативный массив. Используем предыдущий код, немного его дополним:

$fh = fopen(__DIR__ . '/example.csv', "r");
fgetcsv($fh, 0, ',');

// массив, в который данные будут сохраняться
$data = [];
while (($row = fgetcsv($fh, 0, ',')) !== false) {
    list($id, $login, $age) = $row;

    $data[] = [
        'id' => $id,
        'login' => $login,
        'age' => $age
    ];
}

// теперь в массиве $data расположены все элементы из CSV-файла
foreach ($data as $row) {
    echo 'ID:' . $row['id'];
    echo 'Age:' . $row['age'];
    echo 'Login:' . $row['login'];
    //...
}

// или же, чтобы преобразовать в JSON, достаточно написать
header('Content-Type: application/json');
die(json_encode($data));

На этом примере, я показал, как конвертировать csv в массив, а так же, как конвертировать CSV в JSON.

Резюме

В этой статье я подробно рассказал, как можно работать с CSV в PHP, какими способами парсить, и как отображать данные, полученные из CSV. Писал максимально подробно и вариативно, надеюсь, вопросов не осталось ^^.