Модераторы: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 526
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 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 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 557
Регистрация: 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

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




Модератор: Сообщение скрыто.

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.1501 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


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

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