чтение csv файла php
Парсинг от А до Я
Блог о программировании парсеров и 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-команд из файла и перезапускает сам себя. В следующий раз импорт начинается с того места, в котором скрипт прервал свою работу.)
я поняла, что мне обязательно нужно попробовать такое решение. Поиски в инете чего-то похожего окончились успешно.
Я протестировала этот скрипт на файле размером 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.
PHP CSV File Read
This tutorial is to help you to read a CSV file or data. Character Separated Values(CSV) or Comma Separated Values is a file type containing plain text content with a comma or a character as separators.
It is a convenient form to store simple data. PHP has two inbuilt functions to read CSV file.
CSV File Read using PHP fgetcsv()
This function accepts CSV file handle as mandatory argument. It reads CSV data and converts it into array.
Parameters | Description |
---|---|
$file_handle | CSV file resource data. |
$limit | Max length for reading a line of data. |
$separator | Character delimiter. |
$enclosure | Character used to enclose values |
$escape_character | Escape character while reading CSV. |
Note:
CSV File Read Example
First, we have to create a CSV file handle by opening required CSV file. The CSV file we have used for this example is,
fruits.csv
In the above CSV file, it has Comma(,) as a separator and Double Quotes(“) as an enclosure.
The CSV file contains fruits table records. Values represent name, color and color code of the fruits. The PHP script to read this file is,
In this script, we are invoking fgetCSV() by moving CSV file pointer until it reaches the end of the line. Each time, it converts a current line of data into an array.
PHP CSV String Data Read
The function str_getcsv() is for reading CSV from string data instead of file resource. The syntax is,
The first argument is used to pass CSV string data to this function. Rest of the arguments are for the same purpose as we have seen in fgetcsv(). In this function, there is no limit for the reading line of CSV string.
str_getcsv() Example
First, we have to store fruits.CSV file content into a variable and pass it into str_getcsv(). And then, this function is called for separating lines with appropriate line breaks. While iterating among these lines it will be further separated into fields. The script is,
Output:
We will get the same output for both examples.
By iterating this array, we can handle these data in the variety of ways. For example, displaying CSV in grid view or creating query statements and etc.
Displaying CSV Data in Grid View
Creating Queries using CSV Data
Comments to “PHP CSV File Read”
Thank you for this tutorial. CSV file access examples found in source download were very useful.
Awesome tutorial. I just found this place and it is really helpful. Thanks
this is slow
Why you do not use the SQL command
LOAD DATA INFILE ‘c:\\data\\file_to_import.csv’
INTO TABLE TableName
CHARACTER SET latin1 — or utf8
COLUMNS TERMINATED BY ‘,’
OPTIONALLY ENCLOSED BY ‘”‘
ESCAPED BY ‘\’
LINES TERMINATED BY ‘\n’
IGNORE 1 LINES — Remove header ligne
( column1,column2,column3,column4,column5, ….. );
This command is very much faster
I have presented the PHP based solution and you have given a different option. Anyways thanks for the comment.
PHP CSV
last modified December 14, 2020
PHP CSV tutorial shows how to work with CSV data in PHP.
CSV (Comma Separated Values) is a very popular import and export data format used in spreadsheets and databases. Each line in a CSV file is a data record. Each record consists of one or more fields, separated by commas. While CSV is a very simple data format, there can be many differences, such as different delimiters, new lines, or quoting characters.
The fgetcsv reads a line from the provided file pointer and parses for CSV fields. It returns an array containing the fields read. The fputcsv takes an array of data and writes it as a CSV line to the specified file handle.
The league/csv is a simple PHP library to ease CSV documents loading as well as writing, selecting and converting CSV records.
PHP read CSV with fgetcsv
The following example uses the build-in fgetcsv function to read CSV data.
This is the users.csv file.
We read data from users.csv file.
In a while loop, we read all lines until the end of the file. The feof function checks for end-of-file on the file handle.
We read a line with fgetcsv ; the function returns an array of fields read.
If the row is not empty, we output the fields in a message.
The fclose function closes an open file pointer.
PHP write CSV with fputcsv
The following example writes CSV data into a file.
PHP CSV different separator
The fgetcsv function allows to read data with a different separator.
We have data separated with the | character.
The third parameter of the fgetcsv function is the optional delimiter, which sets the field delimiter (one character only). It is comma by default.
PHP send CSV data
The following example sends CSV data as an attachment to the user.
The example reads CSV from a file and returns it to the user; the user receives the file as an attachment.
These headers specify the content type and the disposition as attachment.
We create a file pointer connected to the output stream.
We send the header fields to the output stream.
We read the CSV data into an array.
The array is written to the output stream.
PHP league\csv
The league\csv is a PHP library for processing CSV data.
The library is installed with the above command.
We use League\Csv\Writer for writing.
PHP league\csv count rows
In the first example, we count available rows in the CSV file.
There are six rows in the file, including the header.
We count the number of lines in the CSV file, excluding the header line.
PHP league\csv read data
We read the header and the data from the users.csv file.
We create the reader object and set the header position.
We get the header line.
The getRecords method returns all the CSV records as an Iterator object.
The getContent method returns the CSV document as a string.
PHP league/csv fetchColumn
In the example, we fetch the third column from the data.
PHP CSV in Slim
In the following example, we return CSV data from a Slim application.
We read the data from the file and send it in the body of the response.
We start the built-in server.
PHP CSV in Symfony
In the following example, we send a CSV response from a Symfony application.
A new project is created.
We install the maker and annot dependencies.
The users.csv file is located in the var directory. We read the contents of the file and send it in the response object as an attachment.
We start the web server.
PHP CSV in Laravel
In the following example, we send a CSV response from a Laravel application.
A new project is created.
The users.csv file is located in the storage directory. We read the contents of the file and send it in the response object as an attachment.
In this tutorial, we have worked with CSV data in plain PHP, Symfony, Slim, and Laravel.
CSV (Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных. Спецификация:
— Каждая строка файла — это одна строка таблицы.
— Разделителем (delimiter) значений колонок является символ запятой (,). Однако на практике часто используются другие разделители, то есть формат путают с DSVruen и TSV.
— Значения, содержащие зарезервированные символы (двойная кавычка, запятая, точка с запятой, новая строка) обрамляются двойными кавычками («). Если в значении встречаются кавычки — они представляются в файле в виде двух кавычек подряд.
Будем использовать такие новые функции:
fgetcsv() — Читает строку из файла и производит разбор данных CSV.
count() — Считает количество элементов в массиве или количество свойств в объекте.
Вот как выглядит наш CSV файл:
А вот как мы к нему подключаемся и извлекаем информацию:
Чтобы записать массив данных в csv файл, используем такой код:
Если вам нужен сайт, но вы еще не можете его сделать самостоятельно, тогда можете заказать создание сайтов. Такой вариант может оказаться вполне приемлемый.
Добавить комментарий Отменить ответ
Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.
Построчное чтение файл csv
Здравствуйте.
Направьте в правильную сторону.
Есть файл весом в 400мб формат csv нужно построчно брать данные обрабатывать, и переходить к следующей строке.
Загвоздка в том что на хостинге ограничение по времени выполнения скрипта. И есть желание сделать счетчик какая строка обработалась и при следующем запуске начать работу с того места где закончил.
Использую тестовый файл на 315 строк, и такую конструкцию
То в теории должно выполнится только первые 100 строк, остальное отпасть.
В базе видно что выполнились только первые 100 строк, но цикл while крутится пока не закончится время на выполнения php скрипта, такое впечатление что добавления условия if просто заставляет цикл крутится вечно.
Как это отследить и проверить в чем причина не пойму.
Пытался другие методы, как прочитать файл в массив через file но тогда файл делится на массик в одной ячейки одна строка, проблема в том что в csv в ячейке может быть перенос строки, и file это не учитывает и массив в стиле csv уже не собрать.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Построчное чтение файла+explode()
Здравствуйте. Есть файл где хранятся имена и фамилии. Файл: Name1 LastName1 Name2 LastName2.
Построчное чтение текстового отчета msinfo32
Здравствуйте. Через fopen() и fgets() пытаюсь прочитать строки из текстового отчета msinfo32 и.
Переделал на for но главная задача зафиксировать когда отключится работа скрипта по тайм лимиту, и следующий запуск сделать с места где скрипт закончил.
так вот если сделать цикл for где мы получить первые 100 значений все работает.
Как вариант, записывать куда-нибудь (хотя бы в файл) № обрабатываемой строки. А сам скрипт добавить в крон, где и проверять, насколько давно файл изменён.
Альтернативный вариант — обрабатывать заведомо небольшую (чтобы хватало времени) группу значений, после чего дёрнуть этот же скрипт по HTTP, передав в параметрах № строки. Вариант не особо хороший, но вполне рабочий.
А здесь сотня прошла но конца файла ещё нет.
Идет дальше прогон строк без обработки.
Или timeout или конец файла.
Добавлено через 4 минуты
Ссылка не идет. Текст
Как запустить скрипт из консоли? Очень просто: подключиться к терминалу сервера и выполнить этот скрипт с помощью php: php script.php. В этом случае:
Не убивается воркер веб-сервера и вообще не участвует внешняя оболочка скрипта
По умолчанию max execution time неограничено
Не нужно форматировать вывод как html, плюс можно логировать вывод средствами самой ОС.
Это обеспечивает только одноразовый запуск скрипта, зато висеть он может хоть бесконечно.