Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Чет не могу сам разобраться

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: если есть идеи как ет реализовать пишите
Riv3ro
Отправлено: 06 Апреля, 2011 - 17:18:31
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Всем доброго времени суток. помогите разобраться в следующем...

Надо написать сценарий который будет выполнять - анализ продаж по поставщику.

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

Но проблема не в этом, проблема в том, что при формировании таблицы не все разделяется на отдельные поля.

Например:

1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95
2|Обувь Бос. Жен. кожа 2172с-51 Одесса ТМ"Jina"|2913684|1|639.00|5%|607.05|31.95

Проблема в том, что "название товара" каждый раз разное, надо как то разбить это самое название только с какой то проверкой, чтобы все ставало на свои места. Покамесь пришла мысль только разбить explode`ом но отнести разбитые слова к конкретной переменной не могу так как получается, что описание каждый раз разное, артикул один раз может быть 4 а второй раз 5 а в третий вообще 7. остальное так же.

Помогите а то голова уже не варит =\ а времени на реализацию все меньше и меньше остается

Думать как перенести ет в базу не надо, есть парсер который .csv файл перегоняет в MySQL
(Добавление)
Вот как выглядит на данный момент, ет только часть всего

PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. <?PHP
  4.  
  5. $prim  = "Обувь Мужск.туф Корич нубук 886п Бровары ТМ'ESTE' 41(р) ";
  6.  
  7. echo $prim;
  8.  
  9. $ex = explode(" ", $prim);
  10.  
  11. print '<pre>';
  12. print_r($ex);
  13. print '</pre>';
  14.  
  15.  
  16.  



в результате получаем

Обувь Мужск.туф Корич нубук 886п Бровары ТМ'ESTE' 41(р)
Array
(
[0] => Обувь
[1] => Мужск.туф
[2] => Корич
[3] => нубук
[4] => 886п
[5] => Бровары
[6] => ТМ'ESTE'
[7] => 41(р)
[8] =>
)

Проблем не было, если бы ТМ всегда была на 6 месте. Да и не всегда бывает, что есть ТМ

Бывает еще и так


Обувь Женская Корич кожа 21135 Запорожье, "Мида" 38(р)
 
 Top
Мелкий Супермодератор
Отправлено: 06 Апреля, 2011 - 17:38:28
Post Id



Активный участник


Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009  
Откуда: Россия, Санкт-Петербург


Помог: 618 раз(а)




Что-то я не понял вашу аргументацию, почему explode не подходит.
Количество полей одинаковое, везде 8? В данных символ | не встречается? explode по | более чем достаточно.
(Добавление)
Ёпт, напишите ещё раз и внятно, что вам надо спарсить и фрагмент данных, откуда парсить.


-----
PostgreSQL DBA
 
 Top
Zuldek
Отправлено: 06 Апреля, 2011 - 18:22:58
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. 1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95


вы указываете, что данные есть в таблицах екселя. Приведённый вами пример разбирается элементарно:


1. Вы заявляете что неоторые поля в этих ячейках идут в неправильном порядке:
1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95
19,95|379,05|2913680|1|399,00|5%|Галантерея Сумка жен. 1065 Одесса галантерея|1
Выход - составление регулярных выражений, описывающих эти самые параметры, и выставление их в правильном порядке, как элементов массива $item. (артикул - число с заданным количеством знаков в диапазоне от .. до .., скидка - двухзначное число + % и т.д.)
Если определить элемент таким образом не удастся (абсолютно без всяких единых правил указаны параметры товара), то ошибок избежать не удастся: по крайней мере можно вырезать название товара, и артикул, как последовательность букв и пробелов, и сплошную числовую последовательность.
2. Второе моё угадывание вашей проблемы:
В таблице экселя в одной ячейке содержится длинное значения поля "название" - "Галантерея Сумка жен. 1065 Одесса галантерея серо-зелёная в пушистую крапинку", (горе-менеджеры иногда ведут так учёт в 1-С замусоривая базу). И вам надо из этого названия вычленить ещё с десяток параметров (название, старана-изготовитель, цвет, и т.п.). В этом случае задача интереснее. Всё что вы можете, — постараться написать унифицированные правила для каждого параметра - либо это список уникальных значений (города), либо это правила основанные на количестве букв, повторении символов и т.п. на основе этих правил составляете регулярки и фильтруете через них значения в таблице |Галантерея Сумка жен. 1065 Одесса галантерея|, указав в условии фильтрации, что если фильтр не нашёл параметр - "оставить поле пустым". В результате формируете единый csv-файл для импорта в бд.

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

(Отредактировано автором: 06 Апреля, 2011 - 18:45:32)

 
 Top
Riv3ro
Отправлено: 06 Апреля, 2011 - 19:18:52
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Мелкий пишет:
Ёпт, напишите ещё раз и внятно, что вам надо спарсить и фрагмент данных, откуда парсить.



Вот откуда берется информация.
Проблема со второй колонкой - "товар"
Он описан как только можно, и структурировать его как либо очень тяжело, а с этой колонки товар надо вытаскивать всяческие параметры название, старана-изготовитель, цвет, и т.д.
Zuldek пишет:
либо это список уникальных значений (города), либо это правила основанные на количестве букв, повторении символов и т.п. на основе этих правил составляете регулярки и фильтруете через них значения в таблице |Галантерея Сумка жен. 1065 Одесса галантерея|, указав в условии фильтрации, что если фильтр не нашёл параметр - "оставить поле пустым"


Можно поподробней ...

Я так понял про "уникальные значения (города)" Сделать просто проверку на все возможные которые встречаются у поставщиков?

И по поводу регулярных выражений, как сделать регулярку на "Галантерея" "Сумка" "Обувь" "Жен" "Мужская" если это все обычный текст. Какие правила использовать? я в регулярных не особо силен, так что камнями не забрасывайте если, что не так.
 
 Top
Zuldek
Отправлено: 06 Апреля, 2011 - 20:34:55
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. Можно поподробней ...
  2.  
  3. Я так понял про "уникальные значения (города)" Сделать просто проверку на все возможные которые встречаются у поставщиков?
  4.  
  5. И по поводу регулярных выражений, как сделать регулярку на "Галантерея" "Сумка" "Обувь" "Жен" "Мужская" если это все обычный текст. Какие правила использовать? я в регулярных не особо силен, так что камнями не забрасывайте если, что не так.

Для всех параметров, которые имеют фиксированное количество вариантов значений сделать проверку на соответствие варианту. Либо делать проверку на содержание "галантер" в строке, - так рациоанальнее гораздо.
Одну регулярку для "Галантерея" "Сумка" "Обувь" "Жен" "Мужская" писать не нужно. Я понятия не имею какое число и виды параметров товара у вас должно быть, но, имхо, тут вижу 3 параметра: 1. "тип товара, или группа" как угодно назовите. Пример, - кож. галантерия. - перебор значений из совпадающих вариантов. Для галантерии (кож.-галантерия, галантерия, Галантерия).
2. "Название или вид товара" - прим. обувь, сумка.
3. "муж/жен". прим. - Жен, Мужская,.. тут искать регуляркой совпадение с одним из вариантов (муж. жен. муж жен Муж Жен Муж. Жен. м. ж. М. Ж. мужская Мужская... и т.п.). Надо учесть и перечислить максимальное колисество возможных (зависит от размера вашей базы. Если она очень пухлая, - перечислите как можно больше.)
В итоге, я бы разбирал этот параметр "название товара" с длинным хвостом след образом:
1. Профильтровывал строку, находя регулярками значения параметров. Если не находил - оставлял эти параметры для товара пустыми.
2. Всё что остаётся после отсечения этих параметров, записывал бы в поле "Название товара".
3. Формировал бы итоговый csv файл, не забыв, если реализуем на php, увеличить время выполнения скрипта в настройках (ибо работать он будет долго если база действительно большая).
4. Посадил бы потом за клиент к Mysql ту самую курицу которая таким образом засирала базу товаров чтобы она глазками и ручками отфильтровывала те значения "длинного хвоста" поля "название товара" с которыми не справился ваш скрипт.



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

(Отредактировано автором: 06 Апреля, 2011 - 20:48:57)

 
 Top
Riv3ro
Отправлено: 06 Апреля, 2011 - 20:48:01
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Как вариант то можно так реализовать, этот вариант я оставлял на по следок как страшный сон, так как база действительно очень "жирная" больше 10 к записей и подбор всевозможных значений будет тоже не мало, да и хз что придет в голову операторам которые сидят на вводе товара в базу. Это торговая сеть и объяснять как можно как нет вводить нету возможности.

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

Вы имели ввиду на форуме или есть всетки конкретная ссылка?
 
 Top
Zuldek
Отправлено: 06 Апреля, 2011 - 20:57:02
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




Тогда упростите себе жизнь: выделите в отдельные параметры только то что у вас лежит в отдельных ячейках экселевской таблицы, а всё остальное занесите в одно поле таблицы бд. Я так полагаю что средства редактирования это базы будет предусмотрено, вот пускай и правят её потом руками.

Кстати задача не такая уж и страшная. В любом случае же есть товарные группы в вашей базе и есть какие-то стандартные параметры, есть группы параметров которые встречаются в названиях товара чаще всего. Для них составить десяток регулярных выражений и включить их в фильтр я не вижу сложности. Этим вы уже на 50% избавите "Название товара" от не относящемуся к нему мусору. Более лёгкого пути тут нет.

Цитата:
Вы имели ввиду на форуме или есть всетки конкретная ссылка?

http://forum.php.su/forums.php?forum=4

http://forum.php.su/topic.php?fo...=62&topic=30

(Отредактировано автором: 06 Апреля, 2011 - 20:59:55)

 
 Top
Riv3ro
Отправлено: 07 Апреля, 2011 - 09:54:21
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Zuldek пишет:
Кстати задача не такая уж и страшная. В любом случае же есть товарные группы в вашей базе и есть какие-то стандартные параметры, есть группы параметров которые встречаются в названиях товара чаще всего. Для них составить десяток регулярных выражений и включить их в фильтр я не вижу сложности. Этим вы уже на 50% избавите "Название товара" от не относящемуся к нему мусору. Более лёгкого пути тут нет.


Вы не могли, написать пример кода, для наглядности?
То есть получаем в переменную "название товара" потом експойтом разбиваем ее на слова, и делаем массив. Но как дальше в плане кода? не могу связать в голове справочники с регулярками и перебор массива.
 
 Top
Zuldek
Отправлено: 07 Апреля, 2011 - 11:08:07
Post Id


Постоянный участник


Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010  


Помог: 50 раз(а)




CODE (htmlphp):
скопировать код в буфер обмена
  1. <?
  2. $string = "1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95";
  3. $item = explode("|", $string);
  4. /*
  5. $item[0] - порядковый номер товара
  6. $item[1] - грязное название товара
  7. $item[2] - артикул
  8. $item[3] - цена
  9. $item[4] - скидка
  10. $item[5] - оптовая цена
  11. $item[6] - сумма скидки
  12. city = "Одесса";
  13. group = "галантерея";
  14. me = "жен.";
  15. some_num =[0-9]{4};
  16. Выражения для примеров. Нужно анализировать возможные параметры и создавать более правильные регулярные выражения.
  17. формируем массив с фильтрам (регулярными выражениями). У вас он будет шире и вы скорее всего будете формировать его отдельным скриптом из своих справочников по параметрам.
  18. */
  19. $filter = array ('одесса', 'галантерея', 'жен.', '[0-9]{4}');
  20. $num = count($filter)-1;
  21. for($i=0;$i<count($filter);$i++){
  22.   //Ищем соответствие фильтру в грязном названии товара
  23.   if (preg_match ("/".$filter[$i]."/i", $item[1])){
  24.   //если нашли, - пишем в конец массива найденный параметр
  25.   $item[$num+1] = $filter[$i];
  26.   //и чистим элемент от этого параметра
  27.   $item[1]=preg_replace("/".$filter[$i]."/i","",$item[1]);
  28.   }
  29.   else {
  30.   //если не нашли, - пишем в массив пустое значеие параметра, либо какой-то символ.
  31.   $item[$num+1] = "_";
  32.   }
  33. $num++;
  34. }
  35. echo "исходная строка - ".$string."<br/><br/>";
  36. var_dump($item)."<br/><br/>";
  37. echo "<br/><br/>чистое название товара - ".$item[1];
  38. ?>


исходная строка — 1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95

массив на выходе — array(8) { [0]=> string(1) "1" [1]=> string(10) " Сумка " [2]=> string(7) "2913680" [3]=> string(1) "1" [4]=> string(6) "одесса" [5]=> string(10) "галантерея" [6]=> string(4) "жен." [7]=> string(8) "[0-9]{4}" }

чистое название товара — Сумка

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

(Отредактировано автором: 07 Апреля, 2011 - 11:25:04)

 
 Top
Riv3ro
Отправлено: 11 Апреля, 2011 - 17:34:45
Post Id



Новичок


Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011  


Помог: 0 раз(а)




Чет я не могу допилить Ваш пример
Zuldek пишет:
CODE (htmlphp):
скопировать код в буфер обмена
<?
$string = "1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95";
$item = explode("|", $string);
/*
$item[0] - порядковый номер товара
$item[1] - грязное название товара
$item[2] - артикул
$item[3] - цена
$item[4] - скидка
$item[5] - оптовая цена
$item[6] - сумма скидки
city = "Одесса";
group = "галантерея";
me = "жен.";
some_num =[0-9]{4};
Выражения для примеров. Нужно анализировать возможные параметры и создавать более правильные регулярные выражения.
формируем массив с фильтрам (регулярными выражениями). У вас он будет шире и вы скорее всего будете формировать его отдельным скриптом из своих справочников по параметрам.
*/
$filter = array ('одесса', 'галантерея', 'жен.', '[0-9]{4}');
$num = count($filter)-1;
for($i=0;$i<count($filter);$i++){
  //Ищем соответствие фильтру в грязном названии товара
  if (preg_match ("/".$filter[$i]."/i", $item[1])){
  //если нашли, - пишем в конец массива найденный параметр
  $item[$num+1] = $filter[$i];
  //и чистим элемент от этого параметра
  $item[1]=preg_replace("/".$filter[$i]."/i","",$item[1]);
  }
  else {
  //если не нашли, - пишем в массив пустое значеие параметра, либо какой-то символ.
  $item[$num+1] = "_";
  }
$num++;
}
echo "исходная строка - ".$string."<br/><br/>";
var_dump($item)."<br/><br/>";
echo "<br/><br/>чистое название товара - ".$item[1];
?>


исходная строка — 1|Галантерея Сумка жен. 1065 Одесса галантерея|2913680|1|399,00|5%|379,05|19,95

массив на выходе — array(8) { [0]=> string(1) "1" [1]=> string(10) " Сумка " [2]=> string(7) "2913680" [3]=> string(1) "1" [4]=> string(6) "одесса" [5]=> string(10) "галантерея" [6]=> string(4) "жен." [7]=> string(8) "[0-9]{4}" }

чистое название товара — Сумка

По своей лени я использовал значения рег. выражений в качестве значений новых параметров, но вам лучше использовать более красивые названия.
(Отредактировано автором: 07 Апреля, 2011 - 11:25:04)



Может кто помочь написать функцию...

Есть вот такие справочники
PHP:
скопировать код в буфер обмена
  1.  
  2.  
  3. ///////////// справочники //////////////////
  4.  
  5.  
  6. $man = array ("Мужская","Мужск","мужская","м","М");
  7.  
  8. $woman = array ("Ж","ж","женские","Женские","жен","Жен","жен.","Женский","женский");
  9.  
  10. $teenager = array ("подр.","ПОДРОСТОК","Подросток","Подростковая");
  11.  
  12. $color = array ("Черный","черный","черн/сер","черн","чер/бел","чер","цветн.","Синий","Серый","пестрый","оранж","беж","Корич","Джинс","джинс","голубой","Бел.","крас/рыжие","Бордо","сер/бронз","фуксия","Фиолетовый","розовый","Малиновый","крас.","Коричневый","жолтый","голуой","рыжие","Белый","Бел/син","Бежевый","ч","кр","крас","сирень","сер/бел","чер/бел","розов","серебро","беж/чер","ч/сер","зеленый","б","роз","перс");
  13.  
  14. $material = array ("кожа","велюр","Кожа","Замш","Текст","Лак","джинс","Текс.","Текстить","Текстиль","кожа/замш","лак-замш","нубук","и/кожа","кожа/замш");
  15.  
  16.  
  17.  
  18. // Это не все справочники, будут еще сезон, город, поставщик,
  19. ////////////////////////////////////////////
  20.  
  21.  


И есть такой массив как писали выше
PHP:
скопировать код в буфер обмена
  1.  
  2. $items  = "Обувь Мужская Корич нубук 886п Бровары ТМ'ESTE' 41(р) ";
  3.  
  4.  
  5. $a = explode(" ", $items);
  6.  
  7.  
  8. if ($a[0] == "Обувь")// Сравниваем Тип с Обувью, если это не обувь то в Else просто заносив в другую таблицу.
  9. {
  10.    
  11.     if(isset ($a[1])) // Проверяем если существует, "второе" слово то сравниваем с справочником pol
  12.     {
  13.  
  14.         if ($res = preg_match ("/(Мужская)|(Мужск)|(мужская)|(м)|(М)/", $a[1]))// Проверка на совпадение со справочником $man
  15.             {
  16.                 echo "Совпадает ";
  17.                 $pol = "Мужская";
  18.                 echo $pol;
  19.             }
  20.        
  21.         elseif($res = preg_match ("/(Ж)|(ж)|(женские)|(жен)|(Жен)|(жен.)|(Женский)|(женский)/", $a[1]))// Проверка на совпадение со справочником $woman
  22.             {
  23.                 echo "Совпадает ";
  24.                 $pol = "Женская";
  25.                 echo $pol;
  26.             }
  27.         elseif($res = preg_match ("/(подр.)|(ПОДРОСТОК)|(Подросток)|(Подростковая)/", $a[1]))// Проверка на совпадение со справочником $teenager
  28.             {
  29.                 echo "Совпадает ";
  30.                 $pol = "Подростковая";
  31.                 echo $pol;
  32.             }
  33. //// и тд, так же дальше сравнение по цвету, материалу, городу, поставщику и тд. Опять же есть еще размер к нему справочник не придумал еще
  34.         else
  35.             {
  36.                 echo "По фильтрам совпадения не найдено, значит это артикул <br />";// Артикул по фильтрам не сравнивал так как там все что угодна, и нету смысла.
  37.                 $art = $a[1];
  38.                 echo $art;
  39.             }
  40.  
  41.  


и это только для первого элемента массива, их может быть вроде максимум 10. Для каждого так писать не целесообразно. помогите придумать функцию или цикл.

Как мне кажется надо будет прогонять после этой сортировки, еще по одному виду справочника, из-за того что есть вот такие описания "муж.туф","т.муж","подр.мальч" - которые вместе с точкой. Их разбивать опять експлойтом только по "." и пропускать еще раз через функцию, там где стандартные справочники $man $woman и тд.
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB