Форум русскоязычного сообщества Ubuntu


Хотите сделать посильный вклад в развитие Ubuntu и русскоязычного сообщества?
Помогите нам с документацией!

Автор Тема: Bash-скриптинг - need help  (Прочитано 2293 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Bash-скриптинг - need help
« : 27 Января 2009, 22:16:08 »
Мне никогда не давались конструкции if ... then ... else
В общем есть примерно такой код:
INSERT INTO company VALUES (1740. </span><a id="company1959591" href="/company.xml?company=1959591&amp;region=1">НАФТИЛОС-ГРУПП</a>  <i class="distance">0,88 км</i></div>); INSERT INTO address VALUES("Москва, Арбат ул., 12</div>); INSERT INTO tel VALUES("<div class="tel"> +7 (495) 2919066   тел.</div>);  INSERT INTO tel VALUES("<div class="tel"> +7 (495) 2919066   тел.</div>); INSERT INTO rubric VALUES("См. также:</b><a href="search.xml?category=155690&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Турфирмы</a></div>);И так далее.
Каждый [INSERT INTO company...] начинается с новой строчки.
Всё это обрабатывает примерно такой скрипт:
Auto.sh
#!/bin/bash
echo Начинаем обработку...
echo Обработка парсером...
php ~/parser.php > Company.black1.txt
echo Построение SQL...
replace "<li><div class=\"name\"><span>" "INSERT INTO company VALUES (" "</li>" ");"  -- Company.black1.txt
echo Построение SQL - второй этап...
$tel = 1
[color=red]//Вот где-то здесь долженбыть обработчик поля "tel"[/color]
replace "<div class=\"tel\">" "); INSERT INTO tel1 VALUES(\"" "<strong>" " " "</strong>" " " "<div class=\"url\">" "); INSERT INTO url VALUES(\"" "<div class=\"rubric\"><b>" "); INSERT INTO rubric VALUES(\"" "См. также:" " " "<div class=\"address\">" "); INSERT INTO address VALUES(\"" -- Company.black1.txt
echo Разбиение на более мелкие файлы
iconv -f WINDOWS-1251 -t ISO-8859-1 -o Company.black2.txt
html2text -nobs -ascii Company.black2.txt > Clear.txt
echo Перекодировка...
echo DONE
echo Result:
cat Clear.txt | less
Листинг Parcer.php приложу если надо.

Я понимаю что надо создать переменную tel и последовательно задавать ей значения 1 и 2 - если телефонов у компании 2 и просто 1 - если телефон один. Но вот КАК это выразить в баше - ум отказывается понимать. Он вообще отказывается понимать эту конструкцию.
Буду премного благодарен за помощь.

P.S.
Я знаю что Граббинг это не хорошо - но база создаётся исключительно для нахождения партнёров и заказчиков.
git://github.com/stillru/PersonalPakage.git

Оффлайн Nebulosa

  • Активист
  • *
  • Сообщений: 397
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #1 : 28 Января 2009, 10:05:07 »
По этому листингу переменная tel не участвует в работе вообще.

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

Если приведете четко формат входных данных  и формат выходных данных, набросаю вам php-скрипт (здесь он будет более уместный).

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #2 : 28 Января 2009, 10:47:28 »
Переменная tel ПОКА не участвует нигде я всё немогу придумать как её использовать.
А исходный файл - много файлов скаченных в html с Яндекс.Адресов.
git://github.com/stillru/PersonalPakage.git

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #3 : 28 Января 2009, 10:51:19 »
<ul class="company"><li><div class="name"><span>1. </span><a id="company3371649" href="/company.xml?company=3371649&amp;region=1">БОЛЬНИЦА С ПОЛИКЛИНИКОЙ УПРАВЛЕНИЯ ДЕЛАМИ ПРЕЗИДЕНТА РФ</a>&nbsp;&nbsp;<i class="distance">0,03&nbsp;км</i></div><div class="address">Москва, Романов пер., 2/6</div><div class="tel"><strong>+7 (495) 6228934</strong>&nbsp;&nbsp;тел.</div><div class="rubric"><b>См. также:</b><a href="search.xml?category=152210&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Больницы ведомственные</a></div></li><li><div class="name"><span>2. </span><a id="company2616295" href="/company.xml?company=2616295&amp;region=1">КОСМЕТОН КРЕМЛЕВСКАЯ КЛИНИКА</a>&nbsp;&nbsp;<i class="distance">0,03&nbsp;км</i></div><div class="address">Москва, Романов пер., 2/6</div><div class="tel"><strong>+7 (495) 2021909</strong>&nbsp;&nbsp;тел./факс</div><div class="url"><a href="http://www.cosmeton.ru" target="_blank">http://www.cosmeton.ru</a></div><div class="rubric"><b>См. также:</b><a href="search.xml?category=155040&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Медицинские центры</a></div></li><li><div class="name"><span>3. </span><a id="company1914162" href="/company.xml?company=1914162&amp;region=1">ВОПРОСЫ ПСИХОЛОГИИ ЖУРНАЛ</a>&nbsp;&nbsp;<i class="distance">0,06&nbsp;км</i></div><div class="address">Москва, Моховая ул., 9В</div><div class="tel"><strong>+7 (495) 2029609</strong>&nbsp;&nbsp;тел.</div><div class="url"><a href="http://www.voppsy.ru" target="_blank">http://www.voppsy.ru</a></div><div class="rubric"><b>См. также:</b><a href="search.xml?category=146670&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Редакции периодических изданий</a></div></li><li><div class="name"><span>4. </span><a id="company1943853" href="/company.xml?company=1943853&amp;region=1">ЮС ПАТЕНТНО-ПРАВОВАЯ ФИРМА</a>&nbsp;&nbsp;<i class="distance">0,06&nbsp;км</i></div><div class="address">Москва, Моховая ул., 9</div><div class="tel"><strong>+7 (495) 2584420</strong>&nbsp;&nbsp;тел.</div><div class="tel"><strong>+7 (495) 2031372</strong>&nbsp;&nbsp;факс</div><div class="url"><a href="http://www.yus.ru" target="_blank">http://www.yus.ru</a></div><div class="rubric"><b>См. также:</b><a href="search.xml?category=146240&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Патентные организации, услуги</a></div></li><li><div class="name"><span>5. </span><a id="company2011188" href="/company.xml?company=2011188&amp;region=1">АЛЬМА МАТЕР ТЕЛЕКОМПАНИЯ</a>&nbsp;&nbsp;<i class="distance">0,06&nbsp;км</i></div><div class="address">Москва, Моховая ул., 9</div><div class="tel"><strong>+7 (495) 2480387</strong>&nbsp;&nbsp;тел.</div><div class="tel"><strong>+7 (495) 2482668</strong>&nbsp;&nbsp;факс</div><div class="rubric"><b>См. также:</b><a href="search.xml?category=155340&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Телевидение - компании, программы, студии</a></div></li><li><div class="name"><span>6. </span><a id="company1920857" href="/company.xml?company=1920857&amp;region=1">МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИМ. М.В. ЛОМОНОСОВА (МГУ) ЖУРНАЛИСТИКИ ФАКУЛЬТЕТ</a>&nbsp;&nbsp;<i class="distance">0,06&nbsp;км</i></div><div class="address">Москва, Моховая ул., 9</div><div class="tel"><strong>+7 (495) 6294565</strong>&nbsp;&nbsp;тел.</div><div class="tel"><strong>+7 (495) 6973207</strong>&nbsp;&nbsp;факс</div><div class="rubric"><b>См. также:</b><a href="search.xml?category=152520&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Вузы</a></div></li><li><div class="name"><span>7. </span><a id="company1911095" href="/company.xml?company=1911095&amp;region=1">МГУ ИМ. М.В. ЛОМОНОСОВА ЗДРАВПУНКТ</a>&nbsp;&nbsp;<i class="distance">0,06&nbsp;км</i></div><div class="address">Москва, Моховая ул., 9</div><div class="tel"><strong>+7 (495) 6293748</strong>&nbsp;&nbsp;тел.</div><div class="rubric"><b>См. также:</b><a href="search.xml?category=150990&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Амбулатории, здравпункты и медпункты</a></div></li><li><div class="name"><span>8. </span><a id="company1940542" href="/company.xml?company=1940542&amp;region=1">ПОПОВ И АРХИТЕКТОРЫ</a>&nbsp;&nbsp;<i class="distance">0,07&nbsp;км</i></div><div class="address">Москва, Воздвиженка ул., 4/7, строение 2</div><div class="tel"><strong>+7 (495) 5408583</strong>&nbsp;&nbsp;тел./факс</div><div class="rubric"><b>См. также:</b><a href="search.xml?category=151280&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Архитектурное проектирование</a></div></li><li><div class="name"><span>9. </span><a id="company1986735" href="/company.xml?company=1986735&amp;region=1">ДЕЛЬТАКРЕДИТ КБ ЗАО</a>&nbsp;&nbsp;<i class="distance">0,07&nbsp;км</i></div><div class="address">Москва, Воздвиженка ул., 4/7, строение 2</div><div class="tel"><strong>+7 (495) 9603161</strong>&nbsp;&nbsp;тел.</div><div class="tel"><strong>+7 (495) 9603162</strong>&nbsp;&nbsp;факс</div><div class="url"><a href="http://www.deltacredit.ru" target="_blank">http://www.deltacredit.ru</a></div><div class="rubric"><b>См. также:</b><a href="search.xml?category=149500&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Банки российские</a>, <a href="search.xml?category=198940&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Ипотека</a></div></li><li><div class="name"><span>10. </span><a id="company1951067" href="/company.xml?company=1951067&amp;region=1">ДЕБЕВОЙЗ ЭНД ПЛИМПТОН ЛЛП</a>&nbsp;&nbsp;<i class="distance">0,07&nbsp;км</i></div><div class="address">Москва, Воздвиженка ул., 4/7, строение 2</div><div class="tel"><strong>+7 (495) 9563858</strong>&nbsp;&nbsp;тел.</div><div class="tel"><strong>+7 (495) 9563868</strong>&nbsp;&nbsp;факс</div><div class="url"><a href="http://www.debevoise.com" target="_blank">http://www.debevoise.com</a></div><div class="rubric"><b>См. также:</b><a href="search.xml?category=155940&amp;region=1&amp;where=%D0%9C%D0%BE%D1%81%D0%BA%D0%B2%D0%B0">Юристы - услуги</a></div></li></ul>Вот что генерирует parcer.php
git://github.com/stillru/PersonalPakage.git

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #4 : 28 Января 2009, 10:54:10 »
Выходной формат - SQL где каждой фирме соответствует строка в таблице вида company, adress, tel1, tel2, rubric
git://github.com/stillru/PersonalPakage.git

Оффлайн HoudiniWater

  • Любитель
  • *
  • Сообщений: 98
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #5 : 28 Января 2009, 12:27:44 »
Это оно?

tel=2

if [ $tel = 1 ]
then
echo 'Telephon equal to one'
else
echo 'Telephon equal to many'
fi

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #6 : 28 Января 2009, 13:07:52 »
Сначала надо как то сказать что tel = <div class="tel"><strong>+* (***) *******</strong>&nbsp;&nbsp;тел.</div>//вместо звёздочек любые цифры
Затем сообщить что переменная tel увеличилась
Затем проверить что за первой переменной идёт (или не идёт) второе выражение <div class="tel"><strong>+* (***) *******</strong>&nbsp;&nbsp;тел.</div>
//затем вывести значения в виде
INSERT INTO tel1 VALUES("+7 (495) 2919066   тел.");
INSERT INTO tel2 VALUES("+7 (495) 2919086   тел.");
Если телефонов два.
Или
INSERT INTO tel1 VALUES("+7 (495) 2919066   тел.");Если телефон один.
И опять сообщить что tel = выражению.
Всё загнать в цикл.
git://github.com/stillru/PersonalPakage.git

Оффлайн Nebulosa

  • Активист
  • *
  • Сообщений: 397
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #7 : 28 Января 2009, 16:11:00 »
<?php
$text
=file_get_contents("Company.black1.txt");
$company explode('</li>'$text);

foreach (
$company as $f=>$k
{
preg_match_all ("/<div class=\"(.*?)\">(.*?)<\/div>/"$k$mt);
foreach ($mt[1] as $f1=>$k
{//#1
if ($k=='name') { eregi ('<a.*>(.*)<\/a>',$mt[2][$f1], $n); $zn=$n[1];}
else $zn strip_tags(str_replace(array("&nbsp;","Sm. takje:"),array(" ",""),$mt[2][$f1]));
//#2
($k=='tel') ? $sqlmas[$f]['tel'][]=$zn $sqlmas[$f][$k]=$zn;
}
}
// #3
foreach ($sqlmas as $f=>$k) echo 'INSERT INTO company VALUES (\''.$k["name"].'\', \''.$k["address"].'\', \''.$k["tel"][0].'\', \''.$k["tel"][1].'\', \''.$k["rubric"]."');\n";
?>

"Sm. takje:" замените на "См. также:" форум почему-то  не воспринимает русский текст в блоке code
#1 Тут производится очистка значений от постороннего кода и формирование поименованного массива.
#2 Все телефоны (любое количество) заносятся в подмассив остальное заносится как есть.
#3 Таблица вида company, adress, tel1, tel2, rubric для телефонов выделено два поля, если надо больше, делайте больше.

А теперь баш:  ;D
php -f tosql.php > Company.black2.txt

Не совсем понимаю зачем вам отдельные таблицы названий, телефонов и прочего, сделал все в одну таблицу, если что, последнюю строчку можно переписать как вам нужно.
« Последнее редактирование: 28 Января 2009, 16:13:53 от Nebulosa »

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #8 : 28 Января 2009, 16:41:11 »
Премного благодарствую!
git://github.com/stillru/PersonalPakage.git

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #9 : 28 Января 2009, 17:15:37 »
Осталось только разрешить php есть файлы более 100 мегов :-)
Вылетает с ошибкой Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 86261242 bytes) in /home/rain/Parcer2.php on line 2
Где поправить - не понял. Пойду курить маны.
git://github.com/stillru/PersonalPakage.git

Оффлайн Nebulosa

  • Активист
  • *
  • Сообщений: 397
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #10 : 28 Января 2009, 18:18:58 »
Ну тут уже Bash покажет всю свою мощь!  :coolsmiley: Файлы можно разрезать с помощью head и tail главное знать номера строк с какой по какую разрезать. Это  можно сделать при помощи
grep -n -m1000 "</li>"
grep -n -m2000 "</li>"
...
что-то вроде..

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #11 : 28 Января 2009, 18:53:38 »
Со строками великолепно справляется и split.
Те - сначала собираем большой файл Company.black1.txt
php parcer.php > Company.black1.txtПолучается файл в 86 мегобайт - 158000 строк
Затем режем его по кусочкам в 6000 знаков, например
split --numeric-suffixes -l 6000 Company.black1.txtНа выходе - файлы вида x01, x02... x26
Проганяем каждый из этих файлов через tosql.php
<?php
$counter 
x01;
WHILE (
$counter 26)
{
$text=file_get_contents($counter);
//далее код tosql.php
  
$counter++;
}
?>
И на выводе получаем один файл со всеми данными.
... и после тестового прогона выяснилось что один сценарий php не может сожрать больше 33554432 байтов.
Вернулись к тому с чего начали.
« Последнее редактирование: 28 Января 2009, 18:59:42 от Vegance »
git://github.com/stillru/PersonalPakage.git

Оффлайн Nebulosa

  • Активист
  • *
  • Сообщений: 397
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #12 : 28 Января 2009, 21:15:46 »
Чего уж точно не стоит делать, так это резать файл по некоторому количеству знаков.  :idiot2: Надо действовать более интеллектуально, и резать по </li>. Причем так чтобы в информация по компании оказалась целиком в одном файле, а то можно недосчитаться пары-семерки компаний.

Ну и не надо обрабатывать сразу 26 файлов, сначала первые пять, потом следующие пять..

Или поступить кардинально и не ограничивать память вообще - в начало скрипта добавить:
<?php
ini_set
('memory_limit''-1');
...
:D

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #13 : 30 Января 2009, 21:09:45 »
После некоторого раздумья пришёл к выводу что табличка в базе не соответствует реляционной модели - надо создать две таблички - в одной список рубрик с кодом. В другой - собственно компании с кодом рубрик.
Пока пытаюсь проставить id компаний с помощью count...
git://github.com/stillru/PersonalPakage.git

Оффлайн Vegance

  • Автор темы
  • Любитель
  • *
  • Сообщений: 85
    • Просмотр профиля
Re: Bash-скриптинг - need help
« Ответ #14 : 31 Января 2009, 01:23:19 »
Итак - в голову приходит только мысль - через tosql.php выжать список рубрик с id записи, отсортировать и придать каждой записи ещё одно значение - idrubric.
уникальные значения вытягиваются с помощью
uniq -u <filename> > uniqВ итоге получаем файл вида
|ID|COMPANY|ADDRESS|TEL1|TEL2|URL|RUBRIC||ID|RUBRIC|RUBRICCODE|Вопрос - как увязать поля RUBRIC и RUBRICCODE?
Вопрос номер два - как придать уникальный RUBRICCODE  строке вида |ID|RUBRIC|?
git://github.com/stillru/PersonalPakage.git

 

Страница сгенерирована за 0.035 секунд. Запросов: 25.