Blog. Just Blog

Web-мастеру и не только

Полезные решения для Web-мастеров
Web-мастеру и не только - RSS-канал Web-мастеру и не только - Карта сайта

Парсер CSV-файла на PHP

04.04.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
В одном из рабочих проектов менеджеры загружают информацию в формате CSV-файлов. Все бы хорошо, но у некоторых на компьютерах установлен Microsoft Office, а у других OpenOffice. И, как выяснилось, при сохранении файлов в формате CSV, получается совершенно разный результат: OpenOffice все без исключения поля заключает в кавычки, а поделка от Microsoft делает это как-то выборочно. В некоторых случаях стандартная функция fgetcsv на таких файлах давала сбой, пришлось рисовать свой аналог.
  1. //------------------------------------------------------------
  2. // Функция парсера CSV-файла
  3. //------------------------------------------------------------
  4. // На входе: $file_name - имя файла для парсинга
  5. //           $separator - разделитель полей, по умолчанию ';'
  6. //           $quote - ограничитель строк, по умолчанию '"'
  7. // На выходе: массив значений всего файла
  8. //------------------------------------------------------------
  9. function fuck_csv($file_name$separator=';'$quote='"') {
  10.     // Загружаем файл в память целиком
  11.     $f=fopen($file_name,'r');
  12.     $str=fread($f,filesize($file_name));
  13.     fclose($f);
  14.  
  15.     // Убираем символ возврата каретки
  16.     $str=trim(str_replace("\r",'',$str))."\n";
  17.  
  18.     $parsed=Array();    // Массив всех строк
  19.     $i=0;               // Текущая позиция в файле
  20.     $quote_flag=false;  // Флаг кавычки
  21.     $line=Array();      // Массив данных одной строки
  22.     $varr='';           // Текущее значение
  23.  
  24.     while($i<=strlen($str)) {
  25.         // Окончание значения поля
  26.         if ($str[$i]==$separator && !$quote_flag) {
  27.             $varr=str_replace("\n","\r\n",$varr);
  28.             $line[]=$varr;
  29.             $varr='';
  30.         }
  31.         // Окончание строки
  32.         elseif ($str[$i]=="\n" && !$quote_flag) {
  33.             $varr=str_replace("\n","\r\n",$varr);
  34.             $line[]=$varr;
  35.             $varr='';
  36.             $parsed[]=$line;
  37.             $line=Array();
  38.         }
  39.         // Начало строки с кавычкой
  40.         elseif ($str[$i]==$quote && !$quote_flag) {
  41.             $quote_flag=true;
  42.         }
  43.         // Кавычка в строке с кавычкой
  44.         elseif ($str[$i]==$quote && $str[($i+1)]==$quote && $quote_flag) {
  45.             $varr.=$str[$i];
  46.             $i++;
  47.         }
  48.         // Конец строки с кавычкой
  49.         elseif ($str[$i]==$quote && $str[($i+1)]!=$quote && $quote_flag) {
  50.             $quote_flag=false;
  51.         }
  52.         else {
  53.             $varr.=$str[$i];
  54.         }
  55.         $i++;
  56.     }
  57.     return $parsed;
  58. }
На входе передаются три параметра: обязательный параметр $file_name - путь к CSV-файлу, необязательные параметры $separator - разделитель значений полей в строке, по умолчанию ';' и $quote - ограничитель текстовых полей, по умолчанию двойная кавычка. На выходе из функции возвращается массив с распарсенными значениями всего файла. Дополнительных проверок на существование файла и корректность его внутреннего формата не производится, можете добавить эти функции самостоятельно. Также теоретически могут возникнуть проблемы с обработкой файлов очень большого объема. На моей практике таких проблем не возникало, так что может быть это решение пригодится кому-нибудь еще.

Просмотров: 12279 | Комментариев: 13

PCL's Nice Tooltip 1.1.4

14.03.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Для оформления этого блога мне понадобился хороший скрипт, показывающий всплывающие подсказки при наведении курсора мышки на определенные элементы страницы. Например, на картинки или ссылки. Готовыми скриптами я не пользуюсь, поэтому и здесь решил написать свой. Тем более я пока не встретил ни одного скрипта всплывающих подсказок, который обладал бы нужным мне функционалом. Так на свет появился скрипт PCL's Nice Tooltip, которым я с удовольствием с вами поделюсь.

Описание и возможности PCL's Nice Tooltip:
  • Кроссбраузерность. Скрипт протестирован и гарантированно работает в браузерах Internet Explorer 5.x-8.x и IE-based (Avant Browser, TheWorld, Maxthon и других), Gecko-based (Firefox, Mozilla, Netscape 8.x-9.x, K-Meleon и других), Opera 7.x-10.x, WebKit-based (Safari, Google Chrome, Iron и других). Поддерживаются различные типы DOCTYPE web-страниц.

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

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

  • Хорошая интеграция скрипта с различными AJAX-компонентами. После загрузки через AJAX и обновления какого-нибудь фрагмента текста на странице достаточно вызвать всего одну функцию PCL_TooltipUpdate() и всплывающие подсказки сразу будут доступны в обновленной части страницы. Пример - динамический AJAX-календарик у меня на сайте.

  • Скрипт абсолютно бесплатный, единственным условием его использования является сохранение в исходном коде скрипта информации об авторе и ссылки на этот сайт. Категорически запрещается распространять скрипт PCL's Nice Tooltip за деньги или иное вознаграждение, как отдельно, так и в качестве составной части других дистрибутивов! Всех барыг на кол.
Если в каком-нибудь из заявленных браузеров скрипт будет работать некорректно, то просьба сообщить в комментариях точную версию браузера и операционную систему.

Читать статью целиком »
Просмотров: 7278 | Комментариев: 32

Генераторы прелоадеров

08.02.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Прелоадеры - это анимированные картинки, которые отображаются на период выполнения какого-либо действия. Их обычно используют на сайтах, например, фоновым изображением при отрисовке объемной картинки, индикатором при отправке и получении данных через AJAX, загрузке страницы и т.п. Как правило, анимация в прелоадерах просто закольцована и не отображает реального положения дел (то есть процент обработанной информации), но все равно создает хоть какую-то видимость, что процесс запущен. Сам процесс, впрочем, может наглухо висеть или вообще сдохнуть, но это уже другая история. В этой статье я собрал наиболее интересные сайты, с помощью которых вы можете сгенерировать прелоадер для своего проекта с нужными вам параметрами.


Генератор прелоадеров Preloaders.net

Preloaders.net - активно развивающийся отечественный проект. Вы можете выбрать прелоадер из нескольких категорий и множества вариантов, задать его размеры, скорость анимации, цвета, а затем сохранить полученную картинку себе на компьютер. Варианты прелоадеров постоянно пополняются, есть интерфейс на русском языке. Рекомендую к использованию.

Читать статью целиком »
Просмотров: 25842 | Комментариев: 5

Решение примера в обратной польской нотации

21.01.2011 | Категория: Web-мастеру и не только | Автор: ManHunter
Обратная польская нотация - один из классических алгоритмов, используемых в вычислительной технике. Он используется для вычислений, и особенностью является следование символов операций за символами операндов, а также в отсутствии скобок. Если интересно, можете почитать описание алгоритма польской нотации. Листая сайт с вакансиями, я наткнулся на одно предложение работы, где в качестве тестового задания требовалось написать функцию, которая получает строку примера, записанного в обратной польской нотации, и возвращает результат вычислений. Сама вакансия для меня никакого интереса не представляла, с работой у меня все в порядке, а задание показалось интересным. Вот что у меня сперва получилось.
  1. // Польская нотация. Реализация алгоритма с рекурсией
  2. function polish_recursive($str) {
  3.     // подчистить строку и разделить ее на "стек"
  4.     $stack=explode(' ',trim(preg_replace('/[[:space:]]{2,}/',' ',$str)));
  5.  
  6.     $cnt=count($stack);
  7.     // если в стеке более 1 элемента
  8.     if ($cnt>1) {
  9.         // debug
  10.         //echo join(' ',$stack).'<br>';
  11.  
  12.         // пройтись по стеку
  13.         for ($i=0$i<$cnt$i++) {
  14.             // знак арифметического действия?
  15.             if (in_array($stack[$i], array('-''+''*''/'))) {
  16.                 // слева осталось меньше двух цифр?
  17.                 if ($i<2) { return 'error'; }
  18.                 // выполнить операцию, записать в "стек" результат
  19.                 eval('$stack[$i]=$stack[($i-2)]'.$stack[$i].'$stack[($i-1)];');
  20.                 // изъять из "стека" операнды
  21.                 unset($stack[($i-1)]);
  22.                 unset($stack[($i-2)]);
  23.                 break;
  24.             }
  25.             else {
  26.                 // не арифметический знак и не число
  27.                 if (!is_numeric($stack[$i])) { return 'error'; }
  28.             }
  29.         }
  30.         // в стеке ничего не изменилось после выполнения цикла
  31.         if ($cnt==count($stack)) { return 'error'; }
  32.  
  33.         // следующий рекурсивный проход
  34.         $str=polish_recursive(join(' ',$stack));
  35.     }
  36.     // результат
  37.     return($str);
  38. }
В решении реализован псевдо-стек в массиве, а вычисление выполняется рекурсивно до получения результата или до перехода в состояние "ошибка". Соответственно, возвращается или результат, или сообщение о невозможности его получения.

Читать статью целиком »
Просмотров: 7151 | Комментариев: 7

Генератор текста на основе цепей Маркова

18.12.2010 | Категория: Web-мастеру и не только | Автор: ManHunter
В web-строительстве и SEO цепи Маркова используются для генерации псевдоосмысленных текстов на основании исходных текстов. Это используется для штамповки дорвеев с заданными ключевыми словами, для набора контентной текстовой массы и тому подобным "черным" трюкам. К счастью, поисковые системы научились эффективно определять контент, созданный на основе цепей Маркова и отправляет таких умников в бан. Учить вас подобным технологиям я не собираюсь, для этого есть специальные говносайты, меня интересует только программная реализация алгоритма.


Цепью Маркова называется последовательность испытаний, в каждом из которых появляется только одно из k несовместных событий Ai из полной группы. При этом условная вероятность pij(s) того, что в s-ом испытании наступит событие Aj при условии, что в (s - 1) - ом испытании наступило событие Ai, не зависит от результатов предшествующих испытаний.


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

Из-за леса, из-за гор
едет дедушка Егор:
сам на лошадке,
жена на коровке,
дети на телятках,
внуки на козлятках.

Разберем текст на звенья и связки

из-за [леса, гор]
леса [из-за]
гор [едет]
едет [дедушка]
дедушка [Егор]
Егор [сам]
сам [на]
на [лошадке, коровке, телятках, козлятках]
лошадке [жена]
жена [на]
коровке [дети]
дети [на]
телятках [внуки]
внуки [на]

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

Читать статью целиком »
Просмотров: 37290 | Комментариев: 23

prev 01 ... 22 23 24 25 26 27 28 ... 34 next
Наверх
Powered by PCL's Speckled Band Engine 0.2 RC3
© ManHunter / PCL, 2008-2021
При использовании материалов ссылка на сайт обязательна
Время генерации: 0.07 сек. / MySQL: 2 (0.0018 сек.) / Память: 5 Mb
Наверх