
Парсер CSV-файла на PHP
В одном из рабочих проектов менеджеры загружают информацию в формате CSV-файлов. Все бы хорошо, но у некоторых на компьютерах установлен Microsoft Office, а у других OpenOffice. И, как выяснилось, при сохранении файлов в формате CSV, получается совершенно разный результат: OpenOffice все без исключения поля заключает в кавычки, а поделка от Microsoft делает это как-то выборочно. В некоторых случаях стандартная функция fgetcsv на таких файлах давала сбой, пришлось рисовать свой аналог.Code (PHP) : Убрать нумерацию
- //------------------------------------------------------------
- // Функция парсера CSV-файла
- //------------------------------------------------------------
- // На входе: $file_name - имя файла для парсинга
- // $separator - разделитель полей, по умолчанию ';'
- // $quote - ограничитель строк, по умолчанию '"'
- // На выходе: массив значений всего файла
- //------------------------------------------------------------
- function fuck_csv($file_name, $separator=';', $quote='"') {
- // Загружаем файл в память целиком
- $f=fopen($file_name,'r');
- $str=fread($f,filesize($file_name));
- fclose($f);
- // Убираем символ возврата каретки
- $str=trim(str_replace("\r",'',$str))."\n";
- $parsed=Array(); // Массив всех строк
- $i=0; // Текущая позиция в файле
- $quote_flag=false; // Флаг кавычки
- $line=Array(); // Массив данных одной строки
- $varr=''; // Текущее значение
- while($i<=strlen($str)) {
- // Окончание значения поля
- if ($str[$i]==$separator && !$quote_flag) {
- $varr=str_replace("\n","\r\n",$varr);
- $line[]=$varr;
- $varr='';
- }
- // Окончание строки
- elseif ($str[$i]=="\n" && !$quote_flag) {
- $varr=str_replace("\n","\r\n",$varr);
- $line[]=$varr;
- $varr='';
- $parsed[]=$line;
- $line=Array();
- }
- // Начало строки с кавычкой
- elseif ($str[$i]==$quote && !$quote_flag) {
- $quote_flag=true;
- }
- // Кавычка в строке с кавычкой
- elseif ($str[$i]==$quote && $str[($i+1)]==$quote && $quote_flag) {
- $varr.=$str[$i];
- $i++;
- }
- // Конец строки с кавычкой
- elseif ($str[$i]==$quote && $str[($i+1)]!=$quote && $quote_flag) {
- $quote_flag=false;
- }
- else {
- $varr.=$str[$i];
- }
- $i++;
- }
- return $parsed;
- }
Просмотров: 13519 | Комментариев: 13

Внимание! Статья опубликована больше года назад, информация могла устареть!
Комментарии
Отзывы посетителей сайта о статье
ManHunter
(16.10.2018 в 07:59):
http://php.net/manual/ru/funct...ay-shift.php

Дмитрий
(16.10.2018 в 01:56):
Здравствуйте, как убрать первую строку с названиями стобцов что бы не было ёё массиве?

nick
(04.01.2018 в 13:14):
для больших файлов не подходит

Александр
(02.11.2016 в 02:33):
Спасибо! Решение очень помогло.

vzx
(20.04.2016 в 14:17):
Отлично сработано! Респект!

Алексей
(02.03.2015 в 09:16):
Огромное спасибо, дружище!
Скаченный скрипт отсюда =>http://www.php.su/articles/?cat=examples&page=045, неправильно обрабатывал некоторые строчки массива из файла csv.
Попробовал твою функцию - все стало работать нормально. Еще раз спасибо! Очень выручил!
Скаченный скрипт отсюда =>http://www.php.su/articles/?cat=examples&page=045, неправильно обрабатывал некоторые строчки массива из файла csv.
Попробовал твою функцию - все стало работать нормально. Еще раз спасибо! Очень выручил!

Юрий
(26.06.2012 в 13:20):
MS Office вставляет двойные кавычки перед названием только в случае, если в названии товара также есть двойные кавычки.

Дмитрий
(24.05.2012 в 14:02):
Спасибо! Пригодился!

Генри
(24.02.2012 в 04:35):
Интересное решение. Кстати я встречался с проблемами обработки больших фалов, но ни чего лучше не придумал как обрабатывать файл построчно, через AJAX. Иначе сервер вешается, мол долго как то там все. Но это вышло плюсом в виде строки загрузки в брузер загружающему.

Isaev
(08.04.2011 в 13:22):
Python только для работы с большими числами использую...
Уж больно приятно, когда поддержка их по умолчанию ))
Больше всего в нём убивают отступы, как ограничение блоков (типа begin/end), постоянно бесит. А в общем положительный язык и возможности широкие
Уж больно приятно, когда поддержка их по умолчанию ))
Больше всего в нём убивают отступы, как ограничение блоков (типа begin/end), постоянно бесит. А в общем положительный язык и возможности широкие

ManHunter
(04.04.2011 в 14:52):
А я вот на Python заглядываюсь :)

Isaev
(04.04.2011 в 14:51):
php нравится всё больше :)

ezfalc0n
(03.04.2011 в 05:41):
Да, Дима. Самое интересное - что экспорт импорт через csv в разных продуктах от микрософт по разному ведет себя. Например экспорт из Outlook Express и импорт в Outlook 2003 адрессной книги.

Добавить комментарий
Заполните форму для добавления комментария
