Чтение 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. Писал максимально подробно и вариативно, надеюсь, вопросов не осталось ^^.