Модераторы: korob2001, ginnie
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Perl split 
:(
    Опции темы
hausedark
Дата 12.7.2016, 00:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Здравствуйте, помогите с задачей, делаю парсинг дерева категорий: 

Код

my @ar = split(/<category id="/, $c);
    for (my $i=1; $i<@ar; $i++) {
        my ($id, $name) = split(/" parentId="/, $ar[$i]);
        my ($pid, $name) = split(/">/, $name);
        ($name, $chop) = split(/<\/category>/, $name);
        next if ($id == 3811);
        if (($ca{$id} ne "") and ($ARGV[2] eq "update")) {
            print "up $id;$pid;$name;\n";
            &exec_command("update categories set name = \'$name\', pid = \'$pid\' where id = \'$id\';");
        }
        next if ($ca{$id} ne "");
        print "$id;$pid;$name;\n";
        &exec_command("insert into categories (id, name, pid, kolvo) values (\'$id\', \'$name\', \'$pid\', 0);");
    }


Дерево категорий выглядит таким образом и все работает:

Код

<category id="3680259" parentId="0">Футбол,баскетбол</category>
<category id="3680260" parentId="3680259">Футбол</category>
<category id="3680265" parentId="0">Рыбалка</category>
<category id="3680270" parentId="0">Велоспорт</category>
<category id="3680299" parentId="3680260">Сборная</category>


А что если родительский ID нулевой будет отсутствовать, т.е.

Код

<category id="3680259">Футбол,баскетбол</category>
<category id="3680260" parentId="3680259">Футбол</category>
<category id="3680265">Рыбалка</category>
<category id="3680270">Велоспорт</category>
<category id="3680299" parentId="3680260">Сборная</category>


В таком случае данный метод не работает, подскажите как исправить код чтобы при отсутствии parentId="0" в файле в БД писался 0
PM MAIL   Вверх
igorold
Дата 12.7.2016, 06:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 558
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



Проверяй переменную $ar[$i] на наличие подстроки 'parentId='
Если подстрока есть, парси, нет - присваивай 0.

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
hausedark
Дата 12.7.2016, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Подскажите как это в практике будет выглядеть)
PM MAIL   Вверх
infarch
Дата 12.7.2016, 13:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 525
Регистрация: 13.3.2009

Репутация: нет
Всего: 1



А почему на парсить XML соответствующими модулями вместо регулярок? Наверно проще будет.
PM MAIL   Вверх
hausedark
Дата 12.7.2016, 13:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Но медленнее, скорость работы важна) вот придумать не могу как с этим parentId="0" побороться))
PM MAIL   Вверх
hausedark
Дата 12.7.2016, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Какие будут идеи?) я вообще в панике)) 
PM MAIL   Вверх
hausedark
Дата 13.7.2016, 00:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Вот полный код:

Код

sub parse_categories {
    my $c = shift;
    
    $c = encode("utf8", decode("utf8", $c));
            
    my %ca = ();
    my $command = "select id from categories;";
    my $q = $dbh->prepare($command);
    $q->execute();
    while (my $r = $q->fetchrow_arrayref) {
        $ca{$$r[0]} = "on";
    }
    
    my @ar = split(/<category id="/, $c);
    for (my $i=1; $i<@ar; $i++) {
        my ($id, $name) = split(/" parent_id="/, $ar[$i]);
        my ($pid, $name) = split(/"><!\[CDATA\[/, $name,);
        ($name, $chop) = split(/\]\]><\/category>/, $name);
        next if ($id == 3811);
        if (($ca{$id} ne "") and ($ARGV[2] eq "update")) {
            print "upd $id;$pid;$name;\n";
            &exec_command("update categories set name = \'$name\', pid = \'$pid\' where id = \'$id\';");
        }
        next if ($ca{$id} ne "");
        print "$id;$pid;$name;\n";
        &exec_command("insert into categories (id, name, pid, kolvo) values (\'$id\', \'$name\', \'$pid\', 0);");
    }
    &update_categories;
}


Не понимаю каким образом при отсутствующем parent_id выполнить запись в БД только в поля Id и name

при первом запуске файла с отсутствующем parent_id в бд запишется все ID и parent_id поле name будет пустым для данных категорий, и при повторном запуске имеем такую ошибку
Код

start parser - 13.7.2016 0:53
236"><![CDATA[Электроника и фото]]></category>
;;;
error = insert into categories (id, name, pid, kolvo) values ('236"><![CDATA[Электроника и фото]]></category>
', '', '', 0);


Это сообщение отредактировал(а) hausedark - 13.7.2016, 01:04
PM MAIL   Вверх
igorold
Дата 13.7.2016, 08:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 558
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



Код

my ($pid,$id,$name) = (0,0,'');
if ($ar[$i] =~ /parent_id=/)
{
    ($id, $name) = split(/" parent_id="/, $ar[$i]);
    ($pid, $name) = split(/"><!\[CDATA\[/, $name,);
    ($name, $chop) = split(/\]\]><\/category>/, $name);
}


Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
hausedark
Дата 13.7.2016, 09:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Здравствуйте, заменил эту часть кода
Код

my ($id, $name) = split(/" parent_id="/, $ar[$i]);
        my ($pid, $name) = split(/"><!\[CDATA\[/, $name,);
        ($name, $chop) = split(/\]\]><\/category>/, $name);


Вашим, может быть не туда вставляю)) при повторном запуске скрипта ошибка не выскакивает, а просто добавляет 2 пустые строчки в таблицу БД, а этого быть не должно, name по прежнему пустой(

Вот print отработанного скрипта:

Код

248;236;Оптические приборы;
250;236;Dvd и blu-ray плееры;
236"><![CDATA[Электроника и фото]]></category>
;;;
252;236;Портативная аудиотехника;
745;236;Видеокамеры;


Это сообщение отредактировал(а) hausedark - 13.7.2016, 10:05
PM MAIL   Вверх
hausedark
Дата 13.7.2016, 12:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



2 пустые строчки потому что в XML с отсутствующем  parent_id, 2 строки
PM MAIL   Вверх
igorold
Дата 13.7.2016, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 558
Регистрация: 22.12.2005
Где: Россия->Урал-& gt;Миасс

Репутация: нет
Всего: 17



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

Этот ответ добавлен с нового Винграда - http://vingrad.com
PM MAIL   Вверх
hausedark
Дата 13.7.2016, 18:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



С Perl только столкнулся, дай подсказку)) чего я не вижу smile 
PM MAIL   Вверх
hausedark
Дата 14.7.2016, 02:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 12.7.2016

Репутация: нет
Всего: нет



Мое подумать приводит к такому огромному коду))) а хотелось бы собрать со split

Код

sub parse_categories {

my @arr = localtime(time);
    $arr[4]++;
    $arr[5] =~ s/1/20/;
    local $start_date = "$arr[3].$arr[4].$arr[5] $arr[2]:$arr[1]";
    print "start parser_categories - $start_date\n";
    
    local $dbh = DBI->connect("DBI:mysql:$mysqlbase;$mysqlserver","$mysqluser","$mysqlpassword",{PrintError => 0, RaiseError => 0});
    &exec_command("set names utf8;");

    my %ca = ();
    my $command = "select ind from myshop_categories;";
    my $q = $dbh->prepare($command);
    $q->execute();
    while (my $r = $q->fetchrow_arrayref) {
        $ca{$$r[0]} = "on";
    }
    
    local $dbh = DBI->connect("DBI:mysql:$mysqlbase;$mysqlserver","$mysqluser","$mysqlpassword",{PrintError => 0, RaiseError => 0});
    &exec_command("set names utf8;");
    
    my ($buff,$command,$cur_id);
    my $all_count=0,$cont,$count;
    my $first = 1;    
    my $tag = '<category ';
    my ($el,%cat,$usd);
    
    my $file = "test.xml";
    if (!open (FILE, "$tmp_path/$file")) {
        print "error open file - $tmp_path/$file\n";
        return;
    }

    local $mail = "";
    local ($new, $kolvo) = (0, 0);
    my $categories = "";
    
        my @arr = split($tag,$buff);
        $cont=$tag.(pop @arr) if ($count == 10485760);
        my $first = 1;
        for (my $i=$first; $i<@arr; $i++) {
            $el = $tag.$arr[$i];
            $el = encode("utf8", decode("utf8", $el));
            
            $id = getAttribute('category','id',$el);
            $pid = getAttribute('category','parent_id',$el);

            if (($empty_lines ne '')&&($empty_lines > 0)){
                $empty_lines--;
                next if ($empty_lines > 0);
            }

            $el =~ s/\\//g;

            my $name = getBody('category',$el);        
            next if ($category == 3811);
            
            if (($ca{$id} ne "") and ($ARGV[2] eq "update")) {
            print "upd $id;$pid;$name;\n";
            &exec_command("update categories set name = \'$name\', pid = \'$pid\' where id = \'$id\';");
        }
        next if ($ca{$id} ne "");
        print "$id;$pid;$name;\n";
        &exec_command("insert into categories (id, name, pid, kolvo) values (\'$id\', \'$name\', \'$pid\', 0);");
        }
    
    &update_categories;

PM MAIL   Вверх
hogo090
Дата 21.8.2020, 08:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 1
Регистрация: 21.8.2020

Репутация: нет
Всего: нет



these days, her daughter isn't always yet 5 years vintage, and her diary has a chain of "firsts". such as the primary burn, the primary learning to stroll, the first tongue gaining knowledge of, the first cold, the primary brushing, the first visit to the physician, the primary movie, the primary answering the smartphone, the first boarding the 7th floor with a couple of hundred steps, the primary time to win the prize, the first time to swear, the first time to lie...those many "first times" will grow up with my daughter. whilst the kid appears at her movements and stories whilst she became a child in the destiny, she can absolutely discover it very exciting. if she can keep it down, it will likely be a "very last diary", which facts the daughter's whole lifestyles path
https://www.vipsiteweb.com
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl: CGI программирование"
korob2001
sharq
  • В этом разделе обсуждаются вопросы относящиеся только к CGI программированию
  • Если ваш вопрос не относится к системному или CGI программированию, задавайте его в общем разделе
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", качать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: разработка для Web | Следующая тема »


 




[ Время генерации скрипта: 0.1490 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.