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 :: Чет не могу сам разобраться
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Всем доброго времени суток. помогите разобраться в следующем...
Надо написать сценарий который будет выполнять - анализ продаж по поставщику.
Есть данные в виде Exel таблицы. - Генерируются программой через которую реализуется продажа товара. Можно сформировать несколько таблиц, так как в одной нет всех значений для анализа.
Но проблема не в этом, проблема в том, что при формировании таблицы не все разделяется на отдельные поля.
Проблема в том, что "название товара" каждый раз разное, надо как то разбить это самое название только с какой то проверкой, чтобы все ставало на свои места. Покамесь пришла мысль только разбить explode`ом но отнести разбитые слова к конкретной переменной не могу так как получается, что описание каждый раз разное, артикул один раз может быть 4 а второй раз 5 а в третий вообще 7. остальное так же.
Помогите а то голова уже не варит =\ а времени на реализацию все меньше и меньше остается
Думать как перенести ет в базу не надо, есть парсер который .csv файл перегоняет в MySQL (Добавление)
Вот как выглядит на данный момент, ет только часть всего
Покинул форум
Сообщений всего: 11926
Дата рег-ции: Июль 2009 Откуда: Россия, Санкт-Петербург
Помог: 618 раз(а)
Что-то я не понял вашу аргументацию, почему explode не подходит.
Количество полей одинаковое, везде 8? В данных символ | не встречается? explode по | более чем достаточно. (Добавление)
Ёпт, напишите ещё раз и внятно, что вам надо спарсить и фрагмент данных, откуда парсить.
----- PostgreSQL DBA
Zuldek
Отправлено: 06 Апреля, 2011 - 18:22:58
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
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-файла у вас уже готов.
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Мелкий пишет:
Ёпт, напишите ещё раз и внятно, что вам надо спарсить и фрагмент данных, откуда парсить.
Вот откуда берется информация.
Проблема со второй колонкой - "товар"
Он описан как только можно, и структурировать его как либо очень тяжело, а с этой колонки товар надо вытаскивать всяческие параметры название, старана-изготовитель, цвет, и т.д.
Zuldek пишет:
либо это список уникальных значений (города), либо это правила основанные на количестве букв, повторении символов и т.п. на основе этих правил составляете регулярки и фильтруете через них значения в таблице |Галантерея Сумка жен. 1065 Одесса галантерея|, указав в условии фильтрации, что если фильтр не нашёл параметр - "оставить поле пустым"
Можно поподробней ...
Я так понял про "уникальные значения (города)" Сделать просто проверку на все возможные которые встречаются у поставщиков?
И по поводу регулярных выражений, как сделать регулярку на "Галантерея" "Сумка" "Обувь" "Жен" "Мужская" если это все обычный текст. Какие правила использовать? я в регулярных не особо силен, так что камнями не забрасывайте если, что не так.
Zuldek
Отправлено: 06 Апреля, 2011 - 20:34:55
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Я так понял про "уникальные значения (города)" Сделать просто проверку на все возможные которые встречаются у поставщиков?
И по поводу регулярных выражений, как сделать регулярку на "Галантерея""Сумка""Обувь""Жен""Мужская" если это все обычный текст. Какие правила использовать? я в регулярных не особо силен, так что камнями не забрасывайте если, что не так.
Для всех параметров, которые имеют фиксированное количество вариантов значений сделать проверку на соответствие варианту. Либо делать проверку на содержание "галантер" в строке, - так рациоанальнее гораздо.
Одну регулярку для "Галантерея" "Сумка" "Обувь" "Жен" "Мужская" писать не нужно. Я понятия не имею какое число и виды параметров товара у вас должно быть, но, имхо, тут вижу 3 параметра: 1. "тип товара, или группа" как угодно назовите. Пример, - кож. галантерия. - перебор значений из совпадающих вариантов. Для галантерии (кож.-галантерия, галантерия, Галантерия).
2. "Название или вид товара" - прим. обувь, сумка.
3. "муж/жен". прим. - Жен, Мужская,.. тут искать регуляркой совпадение с одним из вариантов (муж. жен. муж жен Муж Жен Муж. Жен. м. ж. М. Ж. мужская Мужская... и т.п.). Надо учесть и перечислить максимальное колисество возможных (зависит от размера вашей базы. Если она очень пухлая, - перечислите как можно больше.)
В итоге, я бы разбирал этот параметр "название товара" с длинным хвостом след образом:
1. Профильтровывал строку, находя регулярками значения параметров. Если не находил - оставлял эти параметры для товара пустыми.
2. Всё что остаётся после отсечения этих параметров, записывал бы в поле "Название товара".
3. Формировал бы итоговый csv файл, не забыв, если реализуем на php, увеличить время выполнения скрипта в настройках (ибо работать он будет долго если база действительно большая).
4. Посадил бы потом за клиент к Mysql ту самую курицу которая таким образом засирала базу товаров чтобы она глазками и ручками отфильтровывала те значения "длинного хвоста" поля "название товара" с которыми не справился ваш скрипт.
Если не сильны в регулярных выражениях, - тут есть замечательные уроки их написания, даже отдельный подфорум по составлению рег.выражений.
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Как вариант то можно так реализовать, этот вариант я оставлял на по следок как страшный сон, так как база действительно очень "жирная" больше 10 к записей и подбор всевозможных значений будет тоже не мало, да и хз что придет в голову операторам которые сидят на вводе товара в базу. Это торговая сеть и объяснять как можно как нет вводить нету возможности.
Надеюсь, конечно, что еще, что-то в голову придет или мне или кому то с форума, а то это не совсем хороший вариант реализации. (Добавление)
Zuldek пишет:
Если не сильны в регулярных выражениях, - тут есть замечательные уроки их написания, даже отдельный подфорум по составлению рег.выражений.
Вы имели ввиду на форуме или есть всетки конкретная ссылка?
Zuldek
Отправлено: 06 Апреля, 2011 - 20:57:02
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Помог: 50 раз(а)
Тогда упростите себе жизнь: выделите в отдельные параметры только то что у вас лежит в отдельных ячейках экселевской таблицы, а всё остальное занесите в одно поле таблицы бд. Я так полагаю что средства редактирования это базы будет предусмотрено, вот пускай и правят её потом руками.
Кстати задача не такая уж и страшная. В любом случае же есть товарные группы в вашей базе и есть какие-то стандартные параметры, есть группы параметров которые встречаются в названиях товара чаще всего. Для них составить десяток регулярных выражений и включить их в фильтр я не вижу сложности. Этим вы уже на 50% избавите "Название товара" от не относящемуся к нему мусору. Более лёгкого пути тут нет.
Цитата:
Вы имели ввиду на форуме или есть всетки конкретная ссылка?
Покинул форум
Сообщений всего: 8
Дата рег-ции: Апр. 2011
Помог: 0 раз(а)
Zuldek пишет:
Кстати задача не такая уж и страшная. В любом случае же есть товарные группы в вашей базе и есть какие-то стандартные параметры, есть группы параметров которые встречаются в названиях товара чаще всего. Для них составить десяток регулярных выражений и включить их в фильтр я не вижу сложности. Этим вы уже на 50% избавите "Название товара" от не относящемуся к нему мусору. Более лёгкого пути тут нет.
Вы не могли, написать пример кода, для наглядности?
То есть получаем в переменную "название товара" потом експойтом разбиваем ее на слова, и делаем массив. Но как дальше в плане кода? не могу связать в голове справочники с регулярками и перебор массива.
Zuldek
Отправлено: 07 Апреля, 2011 - 11:08:07
Постоянный участник
Покинул форум
Сообщений всего: 2122
Дата рег-ции: Июнь 2010
Выражения для примеров. Нужно анализировать возможные параметры и создавать более правильные регулярные выражения.
формируем массив с фильтрам (регулярными выражениями). У вас он будет шире и вы скорее всего будете формировать его отдельным скриптом из своих справочников по параметрам.
Покинул форум
Сообщений всего: 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];
?>
По своей лени я использовал значения рег. выражений в качестве значений новых параметров, но вам лучше использовать более красивые названия.
(Отредактировано автором: 07 Апреля, 2011 - 11:25:04)
if($a[0]=="Обувь")// Сравниваем Тип с Обувью, если это не обувь то в Else просто заносив в другую таблицу.
{
if(isset($a[1]))// Проверяем если существует, "второе" слово то сравниваем с справочником pol
{
if($res=preg_match("/(Мужская)|(Мужск)|(мужская)|(м)|(М)/",$a[1]))// Проверка на совпадение со справочником $man
{
echo"Совпадает ";
$pol="Мужская";
echo$pol;
}
elseif($res=preg_match("/(Ж)|(ж)|(женские)|(жен)|(Жен)|(жен.)|(Женский)|(женский)/",$a[1]))// Проверка на совпадение со справочником $woman
{
echo"Совпадает ";
$pol="Женская";
echo$pol;
}
elseif($res=preg_match("/(подр.)|(ПОДРОСТОК)|(Подросток)|(Подростковая)/",$a[1]))// Проверка на совпадение со справочником $teenager
{
echo"Совпадает ";
$pol="Подростковая";
echo$pol;
}
//// и тд, так же дальше сравнение по цвету, материалу, городу, поставщику и тд. Опять же есть еще размер к нему справочник не придумал еще
else
{
echo"По фильтрам совпадения не найдено, значит это артикул <br />";// Артикул по фильтрам не сравнивал так как там все что угодна, и нету смысла.
$art=$a[1];
echo$art;
}
и это только для первого элемента массива, их может быть вроде максимум 10. Для каждого так писать не целесообразно. помогите придумать функцию или цикл.
Как мне кажется надо будет прогонять после этой сортировки, еще по одному виду справочника, из-за того что есть вот такие описания "муж.туф","т.муж","подр.мальч" - которые вместе с точкой. Их разбивать опять експлойтом только по "." и пропускать еще раз через функцию, там где стандартные справочники $man $woman и тд.
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.