Php прочитать csv файл

Обновлено: 06.07.2024

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

В предыдущей статье были рассмотрены разные варианты импорта CSV-файла в базу данных MySQL. Там же я отметила, что работа с большими файлами требует особого подхода. Основным ограничением для импорта большого объема данных является время выполнения скрипта, которое задается хостером (как правило 30 секунд).

Мне необходимо было именно автоматизировать процесс полного импорта. Перед вставкой в таблицу значения полей, полученные из scv-файла, требовали анализа и дополнительной обработки.

Когда я прочитала в описании утилиты BigDump (в предыдущей статье я на нее ссылалась) о принципе работы:

The script executes only a small part of the huge dump and restarts itself. The next session starts where the last was stopped. ( Перевод: Скрипт выполняет лишь небольшую часть SQL-команд из файла и перезапускает сам себя. В следующий раз импорт начинается с того места, в котором скрипт прервал свою работу.)

я поняла, что мне обязательно нужно попробовать такое решение. Поиски в инете чего-то похожего окончились успешно.

В параметре path при вызове скрипта передается путь к файлу, из которого надо производить импорт. В скрипте происходит импорт определенного количества строк (в примере - 20000), после чего он перезапускает сам себя с параметрами, среди которых кроме названия файла передается указатель на то место, с которого продолжать импорт ( ftell ).

Я протестировала этот скрипт на файле размером 60 Mb. Отработал он правильно, все проимпортировал. Но время работы, все-таки, хотелось бы уменьшить.

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

Команда INSERT, использующая VALUES, может быть использована для вставки сразу нескольких рядов. Чтобы сделать это, перечислите наборы значений, которые вам надо вставить. Пример:

INSERT INTO tbl_name (a,b,c) VALUES(1,2,3),(4,5,6),(7,8,9);

Апгрейдив скрипт на групповую вставку, получила и вправду более подходящий по быстродействию результат. Но думаю, что на этом пока рано останавливаться, буду искать дальше.

Несправедливо было бы обойти вниманием комментарий maxnag-а к предыдущему посту и не упомянуть о возможности импорта данных из CSV средствами MySQL. Почитала документацию по LOAD DATA INFILE, осталось потестировать на больших файлах :) Сначала я отмела для своего случая такой вариант, но потом решила, что, если он будет достаточно производительным, можно будет проимпортировать данные во временную таблицу, а затем произвести обработку и записать, куда надо. Но о результатах теста как-нибудь в следующий раз.

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Резюме

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

Получает строку из файла и разбирает её в соответствии с форматом CSV . Результаты разбора возвращает в виде массива.

Замечание:

Эта функция принимает во внимание настройки локали. К примеру, если LC_CTYPE установлена в en_US.UTF-8 , то файлы в однобайтовой кодировке будут неправильно прочитаны этой функцией.

Список параметров

Разделитель полей (только один однобайтовый символ). По умолчанию это запятая или символ, который был задан методом SplFileObject::setCsvControl() .

Символ ограничителя полей (только один однобайтовый символ). По умолчанию это двойная кавычка или символ, который был задан методом SplFileObject::setCsvControl() . Пустая строка ( "" ) отключает проприетарный механизм экранирования.

Замечание: Обычно символ enclosure экранируется внутри поля путём его удваивания; однако, символ escape в качестве альтернативы. Поэтому значения по умолчанию этих параметров "" и \" имеют одинаковое значение. Помимо разрешения экранировать символ enclosure символ escape не имеет особого смысла; он даже не предназначен для самого экранирования.

Экранирующий символ (не более одного однобайтового символа). По умолчанию это обратный слеш ( \ ) или символ, который был задан методом SplFileObject::setCsvControl() .

Возвращаемые значения

Возвращает массив содержащий данные прочитанной строки или false в случае ошибки.

Замечание:

Пустая строка CSV-файла будет возвращаться в виде массива, содержащего единственный элемент null , если не используется SplFileObject::SKIP_EMPTY | SplFileObject::DROP_NEW_LINE , и в этом случае пустые строки пропускаются.

Список изменений

Версия Описание
7.4.0 Теперь параметр escape может принимать пустую строку для отключения проприетарного механизма экранирования.

Примеры

<?php
$file = new SplFileObject ( "data.csv" );
while (! $file -> eof ()) var_dump ( $file -> fgetcsv ());
>
?>

webfanat вконтакте
webfanat youtube

csv файлы php

csv файлы php

Как говорится hello world, дорогие друзья! Рубрика php, тема csv файлы. Итак, поехали!

Для начала разберемся что представляют собой csv файлы. Так вот, csv - это текстовый файл позволяющий хранить информацию и отображающий ее в виде таблицы, то есть по строкам и столбцам. Это чем то напоминает форматы exel(xls, xlsx) за исключением того что мы можем хранить только текстовую информацию(текст) в csv. Всякие сложные штуки (кликабельные ссылки, картинки и т п) в csv хранится не могут. Это следует запомнить!

Рассмотрим как создаются файлы csv в php.

При выполнении данного кода будет скачан файл file.csv с данными в таблице.

Разберем код подробнее:

Функции header() устанавливают заголовки для скачивания файла csv. В массиве $array содержаться данные которые будут построчно помещены в таблицу файла.

С помощью строчки:

Функция fputcsv() формирует новую строку таблицы в формате csv. В нее передается два обязательных аргумента: Указатель на файл и индексный массив, элементами которого являются значения полей таблицы. Помимо обязательных аргументов функция fputcsv() может принимать дополнительные: разделитель полей delimiter (только один символ), ограничитель полей enclosure (только один символ), экранирующий символ escape_char (только один символ).

Внутренний механизм функции fputcsv выглядит так.

Если вы хоть немного разбираетесь в php то как видите здесь ничего сложного нет.

Итак, с созданием файла csv разобрались! Теперь переходим к чтению файла данного типа.

Данный код выведет всю информацию из csv файла в виде массива на нашей странице. В начале с помощью функции file_get_contents() мы получаем содержимое файла. Затем это содержимое преобразуем в массив функцией explode(), в качестве разделителя которой является конец строки(константа PHP_EOL). Массив перебираем циклом и каждый его элемент(строку) обрабатываем специальной функцией str_getcsv() которая выполняет разбор CSV-строки в массив. Вот так это все работает!

На этом данную статью можно завершать. Сегодня было показано как создавать и читать файлы CSV. Процесс редактирования файлов рассматривать не будем, так как я думаю не сложно догадаться как это можно сделать.

На этом у меня все. Надеюсь данная небольшая статья оказалась для вас полезной и познавательной! Если так, то не забывайте подписываться на группу Вконтакте и переходите на канал Youtube.

Читайте также: