php разбор csv файла

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

Описание

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

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

Необязательный параметр delimiter устанавливает разделитель поля (только один символ).

Необязательный параметр enclosure устанавливает символ ограничителя поля (только один символ).

Необязательный параметр escape устанавливает экранирующий символ (только один символ).

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

Возвращает индексированный массив с прочтенными полями.

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

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

ВерсияОписание
5.3.0Добавлен параметр escape
5.1.0Параметр length стал необязательным. По умолчанию равен 0, что означает отсутствие ограничения длины.
4.3.5fgetcsv() теперь безопасна для обработки бинарных данных

Примеры

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

Примечания

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

Смотрите также

Источник

CSV файлы на PHP — создание и чтение

Формат CSV

Чтобы понимать суть вещей, нужно разобраться в спецификации CSV файлов, как устроен формат. Давайте коротко.

CSV (Comma-Separated Values — значения, разделённые запятыми) — текстовый формат, предназначенный для представления табличных данных.

Каждая строка файла — это одна строка таблицы.

Это все что нужно знать, чтобы работать с CSV!

Пример для рус. языка:

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Пример для англ. языка:

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Wiki-справка

Большинство программ под CSV понимают более общий формат DSV (delimiter-separated values — значения разделённые разделителем), допускающий использование иных символов в качестве разделителя. В частности, в русской и других локалях запятая по умолчанию зарезервирована под десятичный разделитель. Поэтому как разделитель используется точка с запятой или табуляция (формат TSV).

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

Создание CSV файла в PHP

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

Важным моментом, является кодировка файла. Для корректного отображения кириллицы следует использовать кодировку cp1251 (windows-1251).

Разделитель колонок
Разделитель строк

Также, для разделения строки, может использоваться просто \n (перенос строки, LF). В этом случае, перенос строки внутри значения колонки должен обозначаться как \r (возврат каретки CR).

Функция для создания CSV файла

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла меню

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

Вариант на базе функции str_getcsv() :

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Если такую конвертацию нужно сделать программно, смотрите в сторону онлайн конвертеров с API или готовых библиотек.

Сталкивались с такой задачей и знаете более универсальный способ? Прошу поделиться в комментариях.

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Тема, конечно, интересная. Только этот код в реальных условиях работать не будет.

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

1) Разделитель поля может быть любой. Например, ‘\’, ‘|’ или ещё что похуже.
2) Символ ограничителя поля может быть как двойная, так и одинарная ковычка.
3) Неплохо бы использовать unset в коде. Память на сервере всё-таки не резиновая. Одно дело загрузка файла с пару сотен строк кода, а другое если их пару десятков миллионов.

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

2) Для текущего кода (обоих) это учитывается: в первом создается строка с двойной кавычкой и только. Во втором строка парсится PHP функцией str_getcsv() которая обе кавычки понимает.

3) В каком месте там unset по твоему поможет хорошо избавится от потерь памяти? Если у тебя файл выходит за пределы памяти, что редкость с текущими параметрами серверов, то это пожалуй экстра случай и подход уже нужен будет принципиально другой. Файл читать или записывать нужно будет частями или построчно, а не так целиком. По аналогии ты в ВП запихай 50 000 рубрик и все приехали, нужно будет костыли вставлять для нормальной работы. Но ВП почему-то самая популярная CMS, как же так? Я не писал код на все случаи жизни, код покрывает 80% случаев, остальное уже требует отдельного подхода, а этот код можно взять за основу.

Этот код в реальных условиях у меня работает! Может там и есть баги, но я их не встречал.

П.С. просмотрел второй код, добавил unset() маловероятно что много толку от этого, но лишним не будет.

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Не «суй туда какой угодно разделитель», а все возможные разделители для csv файлов. Ты бы ещё менеджеру предложил указывать разделитель для файла, который он загружает php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

«с текущими параметрами серверов». Поверь, кривым кодом можно положить сервер даже с очень хорошими характеристиками. Я обычно беру за правило, если переменная больше не будет использоваться она должна умереть (или обнулиться). Когда поработаешь с хайлоудом, то начинаешь понимать цену памяти)

И вообще, если пишешь рабочую программу, нужно это делать хорошо, а не в стиле «мой первый скрипт»!

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Демогогия это, ты реальную проблему покажи, так я её не вижу. php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

П.С. я люблю стиль «мой первый скрипт». Этот сайт как раз в таком стиле написан, пока все устраивает php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

php разбор csv файла. Смотреть фото php разбор csv файла. Смотреть картинку php разбор csv файла. Картинка про php разбор csv файла. Фото php разбор csv файла

Важным моментом, является кодировка файла. Для корректного отображения кириллицы следует использовать кодировку cp1251 (windows-1251).

Источник

fgetcsv

(PHP 4, PHP 5, PHP 7, PHP 8)

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

Описание

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

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

Отсутствие этого параметра (или установка его в 0 в PHP 5.1.0 и выше) приведёт к тому, что длина строки будет не ограничена. Это может сказаться на скорости выполнения.

Необязательный параметр separator устанавливает разделитель поля (только один однобайтовый символ).

Необязательный параметр enclosure устанавливает символ ограничителя поля (только один однобайтовый символ).

Необязательный параметр escape устанавливает экранирующий символ (не более одного однобайтового символа). Пустая строка ( «» ) отключает проприетарный механизм экранирования.

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

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

Возвращает индексированный массив с прочтёнными полями.

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

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

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

Примеры

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

Смотрите также

User Contributed Notes 36 notes

If you need to set auto_detect_line_endings to deal with Mac line endings, it may seem obvious but remember it should be set before fopen, not after:

fgetcsv seems to handle newlines within fields fine. So in fact it is not reading a line, but keeps reading untill it finds a \n-character that’s not quoted as a field.

/* test.csv contains:
«col 1″,»col2″,»col3»
«this
is
having
multiple
lines»,»this not»,»this also not»
«normal record»,»nothing to see here»,»no data»
*/

This means that you can expect fgetcsv to handle newlines within fields fine. This was not clear from the documentation.

When a BOM character is suppled, `fgetscsv` may appear to wrap the first element in «double quotation marks». The simplest way to ignore it is to progress the file pointer to the 4th byte before using `fgetcsv`.

// BOM as a string for comparison.
$bom = «\xef\xbb\xbf» ;

Forget this while() loop mumbo jumbo! Use this:

This function has no special BOM handling. The first cell of the first row will inherit the BOM bytes, i.e. will be 3 bytes longer than expected. As the BOM is invisible you may not notice.

Excel on Windows, or text editors like Notepad, may add the BOM.

Here is a OOP based importer similar to the one posted earlier. However, this is slightly more flexible in that you can import huge files without running out of memory, you just have to use a limit on the get() method

Note that fgetcsv, at least in PHP 5.3 or previous, will NOT work with UTF-16 encoded files. Your options are to convert the entire file to ISO-8859-1 (or latin1), or convert line by line and convert each line into ISO-8859-1 encoding, then use str_getcsv (or compatible backwards-compatible implementation). If you need to read non-latin alphabets, probably best to convert to UTF-8.

Hope this is helpful to someone out there.

I needed a function to analyse a file for delimiters and line endings prior to importing the file into MySQL using LOAD DATA LOCAL INFILE

[line_ending] => Array
(
[results] => Array
(
[nr] => 0
[r] => 4
[n] => 4
[rn] => 4
)

[lines] => Array
(
[count] => 4
[length] => 94
)

[delimiter] => Array
(
[results] => Array
(
[colon] => 0
[semicolon] => 0
[pipe] => 0
[tab] => 1
[comma] => 17
)

I had a problem with multibytes. File was windows-1250, script was UTF-8 and set_locale wasn’t work so I made a simple and safe workaround:

Here’s something I put together this morning. It allows you to read rows from your CSV and get values based on the name of the column. This works great when your header columns are not always in the same order; like when you’re processing many feeds from different customers. Also makes for cleaner, easier to manage code.

So if your feed looks like this:

product_id,category_name,price,brand_name, sku_isbn_upc,image_url,landing_url,title,description
123,Test Category,12.50,No Brand,0,http://www.example.com, http://www.example.com/landing.php, Some Title,Some Description

//nothing we control so bail out with a false
return false ;
>

If you want to load some translations for your application, don’t use csv files for that, even if it’s easier to handle.

The following code snippet:

$values = parse_ini_file ( ‘de.ini’ );

I used fgetcsv to read pipe-delimited data files, and ran into the following quirk.

The data file contained data similar to this:

RECNUM|TEXT|COMMENT
1|hi!|some comment
2|»error!|another comment
3|where does this go?|yet another comment
4|the end!»|last comment

I read the file like this:

In this particular case it is easy to spot, but my script was processing thousands of records and it took me some time to figure out what went wrong.

So you’d have to resort to a solution where you use an extremely unlikely enclosure, but since the enclosure can only be one character long, it may be hard to find.

Alternatively (and IMNSHO: more elegantly), you can choose to read these files like this, instead:

In my case it was set to «pl_PL.utf8» but since my input file was in CP1250 most of polish characters (but not all of them!) had gone missing and city of «Łódź» had become just «dź». I’ve «fixed» it with «pl_PL».

This is how to read a csv file into a multidimensional array.

Another version [modified michael from mediaconcepts]

Parse from Microsoft Excel «Unicode Text (*.txt)» format:

This style is shown as an example on this page and in a number of examples on the Internet:

The fgetcsv function seems to follow the MS excel conventions, which means:

— The quoting character is escaped by itself and not the back slash.
(i.e.Let’s use the double quote («) as the quoting character:

Two double quotes «» will give a single » once parsed, if they are inside a quoted field (otherwise neither of them will be removed).

if a single double quote is inside a quoted field it will be removed. If it is not inside a quoted field it will stay).

— leading and trailing spaces (\s or \t) are never removed, regardless of whether they are in quoted fields or not.

— Line breaks within fields are dealt with correctly if they are in quoted fields. (So previous comments stating the opposite are wrong, unless they are using a different PHP version. I am using 4.4.0.)

So fgetcsv if actually very complete and can deal with every possible situation. (It does need help for macintosh line breaks though, as mentioned in the help files.)

I wish I knew all this from the start. From my own benchmarks fgetcsv strikes a very good compromise between memory consumption and speed.

————————-
Note: If back slashes are used to escape quotes they can easily be removed afterwards. Same for leading and trailing spaces.

If you don’t want to define an enclosure charachter you can do the following:

Note: the following data (which is a very common problem) is invalid: «\». Its structure is equivalent to «@ or in other words, an open enclosure, some data and no closing enclosure.

The following functions can be used to get the expected behaviour:

I’ve had alot of projects recently dealing with csv files, so I created the following class to read a csv file and return an array of arrays with the column names as keys. The only requirement is that the 1st row contain the column headings.

I only wrote it today, so I’ll probably expand on it in the near future.

Note that fgetcsv() uses the system locale setting to make assumptions about character encoding.
So if you are trying to process a UTF-8 CSV file on an EUC-JP server (for example),
you will need to do something like this before you call fgetcsv():

[Also not that setlocale() doesn’t *permanently* affect the system locale setting]

A simple function to return 2 Dimensional array by parsing a CSV file.

beware of characters of binary value == 0, as they seem to make fgetcsv ignore the remaining part of a line where they appear.

Maybe this is normal under some convention I don’t know, but a file exported from Excel had those as values for some cells *sometimes*, thus fgetcsv return variable cell counts for different lines.

Hier is an example for a CSV Iterator.

Источник

Парсинг CSV файлов на PHP

В данной статье речь пойдет о распознавании формата CSV.

Что такое формат данных CSV, пояснять не буду, прочитайте об этом на http://ru.wikipedia.org/wiki/CSV.

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

Небольшой фрагмент этого файла

Как видно здесь встречаются кириллица, латиница, умляуты (расширенная латиница).

Для парсинг я воспользовался стандартной ф-цией PHP — fgetcsv.

При разборе на виндовс машине вообще никаких проблем не возникло, все было разобрано, разложено — в общем все как надо, осталось только занести в БД.

При разборе этого файла на линукс машине возникли проблемы — кириллица вообще не хотела распознаваться, если она не была обрамлена — кавычкой («). Решение нашлось за 30 минут и выпитой чашкой чая.

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

Если у вас в проекте используется несколько языков интерфейса, то при переключении, не забудьте переключить локаль. Особенно это важно, если для перевода интерфейса используется ф-ция gettext().

Статья просмотренна 68311 раз, зашло посетителей 24733

25 7 комментариев http%3A%2F%2Fblog.nagaychenko.com%2F2009%2F11%2F28%2F%25d0%25bf%25d0%25b0%25d1%2580%25d1%2581%25d0%25b8%25d0%25bd%25d0%25b3-csv-%25d1%2584%25d0%25b0%25d0%25b9%25d0%25bb%25d0%25be%25d0%25b2%2F %D0%9F%D0%B0%D1%80%D1%81%D0%B8%D0%BD%D0%B3+CSV+%D1%84%D0%B0%D0%B9%D0%BB%D0%BE%D0%B2+%D0%BD%D0%B0+PHP 2009-11-28+08%3A11%3A25 maxnag http%3A%2F%2Fblog.nagaychenko.com%2F%3Fp%3D25 в “Парсинг CSV файлов на PHP”

Парсим csv и tsv файлы в delphi…

Читая иностранные блоги, наткнулся на пост, в котором поднимается проблема парсинга и отображения в TStringGrid tsv файлов (tab-separated values – значения, разделенные символом табуляции, англ.). В таких файлах элементы в строках разделены знако…

Пожалуйста сделайте простой и ясный примерчик того же самого только для asp.net (можно для mvc — будет еще лучше)

Добрый день!
Я программист PHP, с технологиями Майкрософт не работал.
Помочь может ясный ум и Гугл.

ЗЫ Зачем юзать MVC для простого парсинга файлов?

Спасибо за пост. Очень помог побороть проблему с кириллицей.

Источник

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Резюме

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

Subscribe to Блог php программиста: статьи по PHP, JavaScript, MySql

Get the latest posts delivered right to your inbox

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *