|
Цитата: "Givi" от 30 Август, 2011, 01:09:29 1. Апиздошенно интересный процент совпадения требуется. Почему не 80, не 75, а именно 78? И как именно вообще будет задаваться этот процент? Точнее в отношении чего: кол-ва знаков в выбранном поле колонки или положения звезд на небе?78 процент написан от балды, возможно потом это будет 88 процентов, всё будет зависить от наглядных результатов, оптимальный подберется по ходу действия. По поводу отношения, вероятно совпадения нужно искать не только по кол-ву символов, но и по самим символам, например DMX - Party Up имеет по количеству 14 символов с пробелами, первоочередная задача это перевести все данные в нижний или верхний регистр, заменить спецсимволы на что-то, что пока не знаю, а так же убрать полностью пробелы. Дальше идёт подсчет ещё раз кол-ва символов, затем сравнение этих символов, тоесть получается набор из букв: dmxpartyup, думаю в таком порядке врятли попадется ещё какая-то композиция, ах да и порядок ведь тоже нужно как-то понимать, ведь может быть и так: partyupdmx, где Party Up это группа, а DMX это собственно сама песня.Цитата: "Givi" от 30 Август, 2011, 01:09:29 2. Что будет если твоя "логика" встретит два названия, которые на 95% совпадают, но по сути являются совсем разными треками одно и того же исполнителя? К примеру, "Crazy developer", "Crazy Developers". Вроде похожи, но какие-то они совсем разные.в жопу такое совпадение, от удаления какого нибудь из вариантов не обеднею, их будет ну максимум 0.0001% от всего кол-ва.
|
|
|
|
|
В одной таблице, даже колонке порядка 200 000 значений, многие из них одиннаковые, например:DMX - Party UpDMX – Party Up(разные дефисы)или же где-то стоят апострофы, а где-то нет, буква где-то непопала правильная в названии песни и так далее.может быть у кого-то уже есть либа или функция которая ищет дубликаты и показывает ихв процентном соотношении, чтобы к примеру я мог доработать её на удаление дубликатов с совпадением 78%?
|
|
|
|
|
Кто нибудь уже пробовал делать плеер как вконтакте? Главная особенность заключается в том, что при переходе на другие страницы контакта музыка безпрерывно воспроизводится.
|
|
|
|
|
Цитата: "master" от 11 Апрель, 2011, 07:45:53 Цитата: developer от 11 Апрель, 2011, 07:40:07 если из первоначального скрипта выше удаляю unset($hr[$i]);то отрабатывает все 577 строк (с 0 по 576) файлану так если всё работает то и запускай код и не парься {+++76+++} artoodetoo, так не удаляет нужные строки!
|
|
|
|
|
поубирал. если из первоначального скрипта выше удаляю unset($hr[$i]);то отрабатывает все 577 строк (с 0 по 576) файлачто может быть не так, ума не приложу.
|
|
|
|
|
если сделать так то проходит всё что нужно, но удаляет записи из файла как попало, оставляя то чо не нужно, а то что нужно не оставляетКод PHPfunction delline($filenames,$line_no) { $data = file($filenames); unset($data[$line_no]); $gomno = fopen($filenames,'w+'); fputs($gomno, implode("",$data)); fclose($gomno); return TRUE; }delline('price/' . $filename . '.csv',$i);
|
|
|
|
|
RY818 Delivery Star;195;70;15C;104/102R;Yokohama;12;840;летоничего особенного, как и везде
|
|
|
|
|
Отрабатывает проверку от 0 до 288 и всё. Потом работать перестает. При чём ни ошибки, просто вот как зашито где-то. Может я чего-то где-то недосмотрел? с fwrite пробовал тоже самое. Дальше скрипт продолжает работать, но на этом участке дальше $i = 288 не идёт. Код PHP $hr = @file('price/' . $filename . '.csv'); if(!$hr) { echo("error"); } else { echo "<hr />"; for($i=0; $i < count($hr); $i++) { $siska = explode(";", $hr[$i]); echo $i . " search " . $siska[0] . " - " . $siska[3] . ', find: '; $query = mysql_query("select p.productID, p.name, c.optionID, c.productID, c.option_value from ".$main['prefix']."products p, ".$main['prefix']."product_options_values c where p.name = '" . $siska[0] . "' and c.productID = p.productID and c.optionID = 5 and c.option_value = '". $siska[3] ."'"); while ($row = @mysql_fetch_array($query)) { if(!empty($row['option_value'])) { $query_otp4 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '4' and productID = '" . $row['productID'] . "'"); while ($row_otp4 = @mysql_fetch_array($query_otp4)) { $opt1 = $row_otp4['option_value']; } $query_otp7 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '7' and productID = '" . $row['productID'] . "'"); while ($row_otp7 = @mysql_fetch_array($query_otp7)) { $opt2 = $row_otp7['option_value']; } $query_otp8 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '8' and productID = '" . $row['productID'] . "'"); while ($row_otp8 = @mysql_fetch_array($query_otp8)) { $opt3 = $row_otp8['option_value']; } $query_otp1 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '1' and productID = '" . $row['productID'] . "'"); while ($row_otp1 = @mysql_fetch_array($query_otp1)) { $opt4 = $row_otp1['option_value']; } if($opt2 == $siska[1] AND $opt3 == $siska[2]) { unset($hr[$i]); $gomno = fopen('price/' . $filename . '.csv','w+'); fputs($gomno, implode("",$hr)); fclose($gomno); } } } }
|
|
|
|
|
Снова проблема, точнее не проблема, а хотелось бы оптимизировать код.:Код PHP for($i=0; $i < count($hr); $i++) { $siska = explode(";", $hr[$i]); $query = mysql_query("select p.productID, p.name, c.optionID, c.productID, c.option_value from ".$main['prefix']."products p, ".$main['prefix']."product_options_values c where p.name = '" . $siska[0] . "' and c.productID = p.productID and c.optionID = 5 and c.option_value = '". $siska[3] ."'"); while ($row = @mysql_fetch_array($query)) { if(!empty($row['option_value'])) { $query_otp4 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '4' and productID = '" . $row['productID'] . "'"); while ($row_otp4 = @mysql_fetch_array($query_otp4)) { $opt1 = $row_otp4['option_value']; } $query_otp7 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '7' and productID = '" . $row['productID'] . "'"); while ($row_otp7 = @mysql_fetch_array($query_otp7)) { $opt2 = $row_otp7['option_value']; } $query_otp8 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '8' and productID = '" . $row['productID'] . "'"); while ($row_otp8 = @mysql_fetch_array($query_otp8)) { $opt3 = $row_otp8['option_value']; } $query_otp1 = mysql_query("select optionID, productID, option_value from ".$main['prefix']."product_options_values where optionID = '1' and productID = '" . $row['productID'] . "'"); while ($row_otp1 = @mysql_fetch_array($query_otp1)) { $opt4 = $row_otp1['option_value']; } if($opt2 == $siska[1] AND $opt3 == $siska[2]) { $sql = "UPDATE ".$main['prefix']."products SET Price = '".$siska[7]."', in_stock = '".$siska[6]."' WHERE productID = '".$row['productID']."'"; $result = mysql_query($sql) or die(mysql_error()); echo '<a href="http://site/-/p' . $row['productID'] . '/">' . $row['productID'] . '</a> => ' . $row['name'] . '|' . $opt1 . '|' . $opt2 . '|' . $opt3 . '|' . $row['option_value'] . '|' . $opt4 . ' => ' . $siska[0] . '|' . $siska[5] . '|' . $siska[1] . '|' . $siska[2] . '|' . $siska[3] . '|' . $siska[8] . ' - обновлены цена и наличие'; unset($hr[$i]); fputs(fopen('price/' . $filename . '.csv','w+'),implode("",$hr)); } } } }а конкретнее ту часть где идут запросы $query_otp4, $query_otp7, $query_otp8, $query_otp1 они ищут значения из одной и той же таблицы, но в разных строках. Можно ли как-то дополнить $query чтобы сразу, одним запросом производить поиск по нескольким строкам в таблице? или для mysql это слишком? потому что для MS SQL есть FOR XML PATH, а тут хз. может кто сталкивался с такой озабоченой структурой базы?
|
|
|
|
|
всё, решил, выкладываю исходник, вдруг кому пригодится:Код PHP$find = array("Marangoni", "Yokohama", "General Tires", "Toyo", "Debica", "Kumho", "Fulda", "Sava", "Dunlop", "GoodYear", "Hankook", "Barum", "Roadstone", "Trayal", "Maxxis", "Avon", "Tigar", "Lassa", "Continental", "Gislaved", "Nexen", "Bridgestone", "Matador", "Nokian", "Kingstar", "Autoguard", "Michelin", "BFGoodrich", "Starfire", "Firenza", "Sportiva", "Cooper", "Zeetex", "Mabor", "Kleber", "Firestone", "Кама", "Бел"); foreach($find as $found) { preg_match("/".$found."/", $cellval, $matches); if(count($matches) > 0) { $new = explode(" ", $cellval); preg_match_all( "/([0-9]{3})\/([0-9]{2})(.*)/i", $new[1], $cellval_exit); $cellval = str_replace($cellval_exit[1][0] . '/' . $cellval_exit[2][0] . $cellval_exit[3][0], '', $cellval); // убираем размер из строки $cellval = str_replace($matches[0], '', $cellval); // убираем бренд из строки $cellval_exit[3][0] = str_replace("R", "", $cellval_exit[3][0]); // убираем R из радиуса preg_match_all( "/([0-9]{2,3}[A-ZА-Я]{1})|([0-9]{2,3}\/[0-9]{2,3}[A-ZА-Я]{1})/iu", $cellval, $ind); $cellval = str_replace($ind[0][0], "", $cellval); // убираем индекс нагрузки и скорости из радиуса $cellval = $cellval . ' = ' . $cellval_exit[1][0] . ' - ' . $cellval_exit[2][0] . ' - ' . $cellval_exit[3][0] . ' - ' . $ind[0][0] . ' - ' . $matches[0]; print_r($match); } }с помощью этого кода в конечном итоге получаем:Meteo Grip E = 155 - 70 - 13 - 75Q - MarangoniPerfecta = 155 - 70 - 13 - 75T - SavaK715 = 155 - 70 - 13 - 75T - HankookKH17 = 155 - 70 - 13 - 75Т - KumhoRegio Control = 215 - 75 - 17.5 - 126/124M - Fuldaи так далее... Тоесть модель = ширина - высота - радиус - индекс скорости и нагрузки - бренд. решения другого не нашёл. что будет с новыми брендами так же не знаю.
|
|
|
|
|
точно, не подумал про раскладку.сделал так: Код PHPpreg_match_all( "/([0-9]{2,3}[A-ZА-Я]{1})|([0-9]{2,3}\/[0-9]{2,3}[A-ZА-Я]{1})/i", $cellval, $ind);осталось решить проблему с тем что выдирать выдирает, но вместо букв символ: �
|
|
|
|
|
сделал так:Код PHPpreg_match_all( "/([0-9]{2,3}[A-Z]{1})|([0-9]{2,3}\/[0-9]{2,3}[A-Z]{1})/i", $cellval, $ind);вроде работает, но! заметил что пропустило такую строку "MP15 79Т" и "4 Winter 88Т", "4 Winter 88Т", "Kristal Montero 79Т" и ещё несколько, в чём ошибка регулярки?
|
|
|
|
|
спасибо. вообщем получилось отделить сначала бренд, потом размер, теперь в строке осталась модель, индекс скорости и нагрузка. нужно отделить индекс скорости и нагрузку, в основном это 2 цифры и буква, например: 75Т или 75Q или 104S и т.д.но попадаются и такие экземпляры: 89/87Q или 104/102Sкакой регуляркой можно обучить и то и то выдирать?и ещё вопрос, к master скорее всего, больше разбираешься видимо: Hakka Green 95Т XL, что такое XL?
|
|
|
|
|
Цитата: "Givi" от 23 Март, 2011, 03:43:55 думаю не все так просто, ибо та же модель может как захочешь называться: с одного слова, двумя словами, буквами-цифрами и т.д. Вот с этим как минимум возникнут траблы, ибо система не сможет понять название ли это модели или уже индекс скорости (или другой какой-то параметр). Особенно с учетом того, что в прайсе все записи не имеют какой-то систематики.п.с. Когда-то разбирали такие прайсы в 200-250 позиций простым единоразовым вносом каждой позиции в базу и последующую сверку с базой. Если позиции в базе не было, то она "откладывалась" до конца обработки прайсов и в результате мы имели обновление всего что есть + список новых строк, которые нужно довнести вручную. Но это частный случай.вот поэтому и думал сделать выборку из строки по значения array, а остальной мусор отсекать или выводить как название модели. в основном модель идёт именно после размера.есть другой конечно вариант. это вбить в базу всю строку и потом регулярками поиск по базе сделать, но магазин действующий с 1000 позициями товаров и перекраивать базу не получится уже.
|
|
|
|
|
есть прайс xls вида:ЦитироватьШина 155/65R13 Sno-Max(ш.) 73Q CordiantШина 155/70R13 Meteo Grip E+(пш) 75Q MarangoniШина 155/70R13 Meteo Grip E+(ш.) 75Q MarangoniШина 145/70R13 A.drive AA01 71T YokohamaШина 145/70R13 Altimax RT 71T General TiresШина 145/70R13 330 71T ToyoШина 155/65R13 Comfort 82T CordiantШина 155/65R13 EcoControl 73T Fuldaраспарсил xls, получил три колонки: наименование | кол-во | ценахочу сделать обновление цены в базе с проверкой по параметрам, нужно разделить строку выше: {шины - это раздел} {ширина}/{высота}{Raдиус} {модель} ({сезон}) {индекс нагрузки} {бренд}как лучше сделать, разбить это всё дело регулярками и потом делать проверку? но бывают проблемы с тем что кое-где из строк указаны не все параметры: Шина 155/65R13 Passio2 Debica или Шина 155/R13 Hakka 91Q Nokianили указано слишком много ненужных параметров: Шина 185/65R14 Ice Cruiser 5000(пш) (WC50PZ) 86T Bridgestone или Шина 165/70R14C KC11 89/87Q Kumho или в другом порядке попадаются параметры, например: Шина 205/70R16 Кама-Flame 91Q б/кдумал сделать список всех параметров, поместить каждый в отдельный array:Код PHP$brand = array("Cordiant", "Marangoni", "Yokohama", "General Tires", "Toyo", "Debica", "Kumho", "Fulda", "Sava", "Dunlop", "GoodYear", "Hankook", "Barum", "Roadstone", "Trayal");$size = array("155/65R13", "155/70R13", "145/70R13", "155/65R13", "155/65R13");$ind = array("86T", "73T", "82T", "75Q", "71T");.....после чего проводить поиск по строке по каждому параметру и значению из array, выдергивать их и проводить сравнение по базе товаров.пытался с помощью preg_match:Код PHP$isExists = preg_match("/$find/s", $cellval);но не получилось, неужели по каждому из параметров нужно цикл делать?может кто подскажет верный путь.
|
|
|
|
|