Работа с CSV файлами на PHP


Работа с CSV файлами на PHP

(PHP 3 >= 3.0.8, PHP 4, PHP 5)

fgetcsv — Читает строку из файла и производит разбор данных CSV

Описание array fgetcsv ( resource handle [, int length [, string delimiter [, string enclosure]]] )

Корректный файловый указатель на файл, успешно открытый при помощи fopen() , popen() , или fsockopen() .

Должен быть больше самой длинной строки (в символах), найденной в CSV-файле (включая завершающий символ конца строки). Он стал необязательным в PHP 5. Если этот аргумент не указан (или равен 0 в версиях PHP 5.0.4 и выше), максимальная длинна строки не ограничена, но функция работает немного медленнее.

Устанавливает разделитель поля (только один символ). По умолчанию это запятая.

Устанавливает символ ограничителя поля (только один символ). По умолчанию это двойная кавычка. Добавлен в PHP 4.3.0.

Функция fgetcsv() возвращает FALSE в случае ошибки, а также по достижению конца файла.

Замечание: Пустая строка CSV-файла будет возвращена в качестве массива, содержащего единственный элемент null , ошибки в данном случае не возникнет.

Пример 1. Чтение и вывод на экран содержания CSV-файла

= 1 ;
$handle = fopen ( «test.csv» , «r» );
while (( $data = fgetcsv ( $handle , 1000 , «,» )) !== FALSE ) <
$num = count ( $data );
echo «

$num полей в строке $row:

\n» ;
$row ++;
for ( $c = 0 ; $c $num ; $c ++) <
echo $data [ $c ] . «
\n» ;
>
>
fclose ( $handle );
?>

fgetcsv() стала правильно обрабатывать двоичные данные начиная с версии PHP 4.3.5

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

Замечание: Если у вас возникают проблемы с распознаванием PHP окончания строк при чтении файлов на Macintosh-совместимом компьютере или при чтении файлов, созданных на Macintosh-совместимом компьютере, необходимо включить опцию auto_detect_line_endings .

Чтение и запись в CSV на PHP

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

PHP как известно не умеет работать excel-файлами стандартными средствами. Конечно есть множество различных классов, которые могут читать и записывать информацию в excel, но с ними возникает достаточно много проблем (об этом мы напишем в следующих статьях).

Куда проще и удобней работать с csv-файлами.

Для примера сделаем небольшую программку. Она будет обрабатывать csv-файл сотрудников компании OX2.ru.

Создадим новую таблицу в Excel, содержащую следующие поля:

Сохраним таблицу как csv-файл, с разделителем поля «;».


У нас должен получиться такой файл:

«Иванов А.А.»;»Программист компании OX2.ru»;89255552332

«Сидоров А.Е.»;»Дизайне компании OX2.ru»;89161231212

«Пирожков А.Б.»;»Арт-директор OX2.ru»;84951232121

«Кулибин Б.А.»;»Менеджер OX2.ru»;89031233333

Ниже приведен исходный код с подробным описанием.

Код слелан на ООП с использованием классов, и при небольшой доработки может многократно использоваться в различных приложениях. Если вы не привыкли к программированию на классах, а используете функции или еще что-то, то настоятельно рекомендуем переучиваться ))

Так же в коде используется генерация исключений (Exception), о них читайте в следующих наших статьях.

_csv_file = $csv_file; //Записываем путь к файлу в переменную

throw new Exception(«Файл «$csv_file» не найден»);

public function setCSV(Array $csv) <

//Открываем csv для до-записи,

//если указать w, то ифнормация которая была в csv будет затерта

$handle = fopen($this->_csv_file, «a»);

//Записываем, 3-ий параметр — разделитель поля

fputcsv($handle, explode(«;», $value), «;»);

* Метод для чтения из csv-файла. Возвращает массив с данными из csv

public function getCSV() <

$handle = fopen($this->_csv_file, «r»); //Открываем csv для чтения

$array_line_full = array(); //Массив будет хранить данные из csv

//Проходим весь csv-файл, и читаем построчно. 3-ий параметр разделитель поля

while (($line = fgetcsv($handle, 0, «;»)) !== FALSE) <

$array_line_full[] = $line; //Записываем строчки в массив


fclose($handle); //Закрываем файл

return $array_line_full; //Возвращаем прочтенные данные

$csv = new CSV(«ox2.csv»); //Открываем наш csv

* Чтение из CSV (и вывод на экран в красивом виде)

CSV до записи:

echo «Должность: » . $value[1] . «
«;

echo «Телефон: » . $value[2] . «
«;

* Запись новой информации в CSV

$arr = array(«Антонов Б.А.;Админ OX2.ru;89031233333»,

«Колобков В.Б.;Босс OX2.ru;89162233333»);

echo «Ошибка: » . $e->getMessage();

Основную работу с CSV файлами на себя берет класс CSV , Он имеет следующие методы:

setCSV(Array $csv) — записывает данные в csv-файл. Данные должны быть переданы массивом. Метод может дозаписывать csv файл, и создавать новый (читайте в описании).

Метод getCSV читает данные из csv файла, и возвращает двумерный массив следующего вида:

Работа с CSV файлами на PHP

Освойте бесплатно наиболее простой, быстрый и гибкий способ создавать адаптивные веб-сайты.

Дизайн лендинга

Создавайте дизайн любых сайтов — для себя и на заказ!

Популярное

  • Главная
  • ->
  • Материалы

  • ->
  • Работа с данными в формате CSV

Reg.ru: домены и хостинг

Крупнейший регистратор и хостинг-провайдер в России.

Более 2 миллионов доменных имен на обслуживании.

Продвижение, почта для домена, решения для бизнеса.

Более 700 тыс. клиентов по всему миру уже сделали свой выбор.

Бесплатный Курс «Практика HTML5 и CSS3»

Освойте бесплатно пошаговый видеокурс

по основам адаптивной верстки

на HTML5 и CSS3 с полного нуля.

Фреймворк Bootstrap: быстрая адаптивная вёрстка

Пошаговый видеокурс по основам адаптивной верстки в фреймворке Bootstrap.

Научитесь верстать просто, быстро и качественно, используя мощный и практичный инструмент.

Верстайте на заказ и получайте деньги.

Что нужно знать для создания PHP-сайтов?

Ответ здесь. Только самое важное и полезное для начинающего веб-разработчика.

Узнайте, как создавать качественные сайты на PHP всего за 2 часа и 27 минут!

Создайте свой сайт за 3 часа и 30 минут.

После просмотра данного видеокурса у Вас на компьютере будет готовый к использованию сайт, который Вы сделали сами.

Вам останется лишь наполнить его нужной информацией и изменить дизайн (по желанию).

Изучите основы HTML и CSS менее чем за 4 часа.


После просмотра данного видеокурса Вы перестанете с ужасом смотреть на HTML-код и будете понимать, как он работает.

Вы сможете создать свои первые HTML-страницы и придать им нужный вид с помощью CSS.

Бесплатный курс «Сайт на WordPress»

Хотите освоить CMS WordPress?

Получите уроки по дизайну и верстке сайта на WordPress.

Научитесь работать с темами и нарезать макет.

Бесплатный видеокурс по рисованию дизайна сайта, его верстке и установке на CMS WordPress!

Хотите изучить JavaScript, но не знаете, как подступиться?

После прохождения видеокурса Вы освоите базовые моменты работы с JavaScript.

Развеются мифы о сложности работы с этим языком, и Вы будете готовы изучать JavaScript на более серьезном уровне.

*Наведите курсор мыши для приостановки прокрутки.

Работа с данными в формате CSV

В этой заметке мы разберем два момента, касающихся работы с данными в формате CSV. Мы рассмотрим, как генерировать CSV-файл, обладая некими исходными данными и увидим, как вывести данные формата CSV на экран.

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

1. Генерация CSV-файла (данных, разделенных запятыми)

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

Пример того, что мы должны получить:

Как видите, изначально мы формируем массив с данными.

Затем создаем переменную с указанием пути до CSV-файла. Пока его нет, но он автоматически будет создан в процессе работы скрипта. В нашем случае файл лежит в той же папке, что и скрипт, который его создает.

Далее мы открываем файл на запись и заносим результат этой операции в специальный дескриптор — обычную переменную, которую мы будем чуть позже использовать при наполнении и при закрытии файла.

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

После этого нам остается совсем немного: проходимся в цикле по строкам формируемого CSV-файла, указав при этом, что при каждой итерации цикла мы должны занести значение из массива $sales в переменную $sales_line.

В цикле же идет запись данных в файл с помощью функции fputcsv(), которой мы передаем в качестве параметров тот самый дескриптор $fo и переменную $sales_line, которая последовательно хранит в себе все строки нашего будущего CSV-файла.


Для обработки возникающих ошибок мы используем условие, согласно которому функция fputcsv() будет остановлена в том случае, если операция завершится неудачей.

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

Финальный аккорд — закрытие файла, после того, как мы закончили с ним работать.

Как видите, ничего сложного во всем этом процессе нет. Теперь давайте посмотрим, как можно вывести данные в формате CSV на экран (печать).

2. Вывод на экран (на печать) данных в формате CSV

Точно так же как и в первом случае, у нас есть некий исходный массив, который теперь нам нужно отобразить в браузере. Как это делается? Давайте посмотрим на код ниже.

Что мы делаем в этом коде после объявления массива?

Для вывода на экран нужно использовать так называемый «выходной поток» — php://output. Далее мы создаем простенькое форматирование для вывода данных в виде таблицы и, как и в первом случае, запускаем цикл foreach.

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

В конце, после вывода на экран, закрываем «файл».

Вот и все — с обеими задачами мы справились легко и элегантно. Разумеется, во втором примере вы можете создать красивое html-оформление для выводимой информации, а не довольствоваться таблицей с серой рамкой:)

На этом все, успехов вам!

С уважением, Дмитрий Науменко

Понравился материал и хотите отблагодарить?
Просто поделитесь с друзьями и коллегами!

Работа с csv файлом

22.05.2020, 00:50

Работа с csv
Нужно сделать импорт из в базу из csv файла и обратно на php. Как это сделать? И как можно.

Работа с CSV файлами
Есть такая CSV таблица: Нужно с помощью неё получить ссылки такого вида: CSV файлы формата.

Работа в CSV через PHP
Имеется csv файл. В нём таблица в несколько тысяч строк стобцы следующие: Договор,Группа.

Парсинг от А до Я

Блог о программировании парсеров и web-автоматизации

Поиск по блогу

понедельник, 31 мая 2010 г.


PHP: построчное чтение и обработка больших CSV-файлов

С проблемой обработки больших 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, осталось потестировать на больших файлах :) Сначала я отмела для своего случая такой вариант, но потом решила, что, если он будет достаточно производительным, можно будет проимпортировать данные во временную таблицу, а затем произвести обработку и записать, куда надо. Но о результатах теста как-нибудь в следующий раз.

Всем удачных решений! :)

Чтобы быть в курсе обновлений блога, можно подписаться на RSS.

Простой импорт/экспорт в CSV для PHP & MySQL

В ходе разработки сервиса по расчете статистики по управлению запасами для интернет-магазинов возникла задача быстро организовать импорт/экспорт таблиц между разными MySQL серверами. Поскольку надо было сделать просто и прозрачно — оптимизация будет впереди — решил воспользоваться авторскими рекомендация из документации по MySQL 5.0.

В качестве формата обмена данными решил принять CSV именно по причине простоты реализации.

В итоге, получилось две функции

Комментарии

  • Файл можно создать на том же хосте, где расположен MySQL. Если ОС настроена с возможностью на сетевой диск с общим доступом, можно писать и на другой сервер.
  • Если поле в таблице равно NULL, в CSV файле будет выведено \N.
  • Для записи файла на локальный диск на сервере пользователю требуются права FILE не на уровне БД, а глобально на уровне сервера MySQL. Можно установить через PHPMyAdmin или запросом
  • Для записи файла в каталог, на каталог должны быть даны права на запись для пользователя mysql или стоять атрибуты 757 или 777 (разрешена запись для прочих пользователей)

Что имеем в итоге?

  1. Короткие и очень быстрые функции, за счет того, что выполняются одним MySQL запросом.
  2. Довольно гибкая реализация — можно легко управлять множеством параметров, в том числе и списком полей
    • Для экспорта: путем изменения списка полей в массиве полей или использования подзапроса вместо имени таблицы (тогда в массиве будут указаны поля этого подзапроса) — например, будет выглядеть так
    • Для импорта: путем использования пользовательской переменной для пропуска ненужных полей — например, пропустит второе и четвертое поле в CSV-файле.

Таким образом, вопрос простоты и быстроты разработки решен. А когда появится вопрос скорости работы и эффективности — можно будет заняться и оптимизацией.


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

Импортировать файл CSV в массив

Спасибо за ответ. Я попробую и обновлю свой вопрос, у меня есть свой код, но немного грязно, чтобы показать все. Моя проблема в том, что я не правильно понимаю индексы.

И мне удается прочитать данные, но это даст мне ошибку:

Ошибка: Обратите внимание: неопределенный индекс: test-product-1 in ….
‘Test-product-1’ взят из столбца sku в файле csv

Я пытаюсь использовать CSV-файл для импорта в массив для замены

Но я не могу создать тот же массив при импорте из файла CSV, что вызовет проблемы. Примеры для CSV для массива: http://php.net/manual/en/function.str-getcsv.php

Следующим шагом является расширение скрипта для обработки цен. Мне нужно иметь возможность забрать эти переменные из файла CSV тоже. И используйте их внутри для цикла.

Решение

Я думаю, что проблема в том, что когда вы сохраняете строку, вы сохраняете ее индексируемую по номеру строки ( $key будет номер строки в файле). Вместо этого я думаю, что вы хотите проиндексировать его по первому столбцу файла CSV. Поэтому сначала извлеките данные (используя str_getcsv() как вы уже сделали) и индексировать по первому столбцу ( [0] ) …

Если вы хотите добавить первую строку в качестве заголовка и использовать ее для ввода данных …

Удаляет первую строку массива, используя array_shift() а затем использует эту строку в array_combine() в качестве ключей для каждого ряда. С вашими тестовыми данными вы получите что-то вроде …

Другие решения

Я использовал следующий код в моем проекте, и он отлично работает для меня.

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

Как создать файл CSV с помощью PHP (и загрузить его)

Например, у меня есть переменная «$ foo», которая включает все данные, которые я хочу показать в CSV:

Создайте CSV-файл с именем «some.csv», содержимое которого равно $ foo

Загрузите «some.csv» на мой сервер.

Как это может быть сделано?

Обновление: Вот точный код, который работал для меня.

обратите внимание на @ перед именем файла

Если $ foo уже отформатирован csv. Вы можете использовать file_put_contents()


Вы не указываете метод загрузки. Вот пример использования ftp (UNSECURE):

Если у вас уже есть переменная со всеми данными, вы можете использовать file_put_contents, чтобы сохранить ее как csv

Как загрузить CSV-файл с помощью PHP ( рабочий код )

Вызвать метод Csv

Если вы используете Codeignitor Framework, поэтому этот код слишком легко интегрировать, нет жесткого и быстрого правила, вы также можете использовать этот код простой PHP, а также …..

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

Теперь ваш файл будет записан в каталог, установленный в $directory с именем файла, установленным в $file .

Работа с CSV-файлом в php

У меня есть файл CSV, который уже имеет два значения, разделенные запятыми value1 и value2, которые будут перезаписаны каждый раз при запуске файла.

Это значение1 и value2 будут использоваться в качестве параметров для файла1 для получения следующие значения, которые захватываются его индексом 0 и 1 из csv.

Мне нужно добавить файл2, который будет делать то же самое и записать его значение как value3 и value4 в том же файле CSV, т.е. когда я запускаю file2.

Теперь, когда я запускаю файл2, сначала он перезаписывает значения file1, мне нужно сделать статический, чтобы индекс CSV 0 и 1 был для file1 и index 2 и 3 для file2. Кто-то имеет этот ответ?

Работа с CSV файлами на PHP

Форум Приднестровской поддержки CMS XOOPS.

По ссылке вы можете скачать последнюю версию CMS XOOPS. А так же прочитать инструкции по установке XOOPS и модулей

По данным ссылкам можно скачать модули нашей разработки.

Модуль инструкций. Ознакомьтесь с установкой XOOPS. C начальными познаниями по HTML,CSS, JS, PHP и др.

Добро пожаловать на сайт поддержки XOOPS.

Приднестровская поддержка XOOPS

При работе с таблицами (например, в Excel) есть возможность сохранения таблицы в формате CSV . В этом формате каждая строка будет содержать значения ряда ячеек таблицы, разделенных точкой с запятой. Например, таблица

1 2 3 4
5 6 7 8
9 10 11 12

при сохранении в формате CSV будет выглядеть следующим образом:
1;2;3;4
5;6;7;8
9;10;11;12

Для чтения CSV-файлов используется функция fgetcsv(). Функция имеет следующий формат:
fgetcsv( , [ ], [ ],
[ ]);
Если не указан, то по умолчанию используется , (запятая). А если не указан , то по умолчанию используется символ » (кавычка).

Функция fgetcsv() считывает из файла одну строку при каждом вызове. Считывание будет выполняться до тех пор, пока не встретится символ новой строки (\n), символ конца файла или из файла не будет прочитано указанное количество байт. Строка будет разбита по разделителю и помещена в возвращаемый массив.

Если какая-либо ячейка содержит символ разделителя, то все содержимое ячейки обычно заключается в кавычки. Если используется другой символ, то он должен быть указан в параметре .

При сохранении в формате CSV таблица

1 2 3 4
5 6 7 8
9 10 11 12;15

будет выглядеть так:
1;2;3;4
5;6;7;8
9;10;11;»12;15″

Чтобы преобразовать CSV-файл в HTML-таблицу, можно воспользоваться кодом, приведенным в листинге 47.

Листинг 47. Преобразование CSV-файла в HTML-таблицу

Илон Маск рекомендует:  Что такое код ispunct
Понравилась статья? Поделиться с друзьями:
Кодинг, CSS и SQL