Помогите с xml дампом русской Википедии

Статус
В этой теме нельзя размещать новые ответы.

mp_petrol

Новичок
Помогите с xml дампом русской Википедии

Есть xml дамп русской Википедии. Структура его следующая:
PHP:
<page> 
<title>Заголовок</title> 
<id>380248</id> 
<revision> 
<id>2097005</id> 
<timestamp>2008-12-16T14:07:23Z</timestamp> 
<contributor> 
<username>User</username> 
<id>9835</id> 
</contributor> 
<minor /> 
<comment>Комментарий</comment> 
<text xml:space="preserve">Текст статьи с вики разметкой</text> 
</revision> 
</page> 
И так далее
Задача такова:
Нужно удалить всё от <page> до </page> (с тегами page в том числе), если <title> начинается с ключевых слов: Файл:, Изображение:, Mediawiki: и Википедия:
После этого надо скопировать значение из титла, преобразовать его в url код и вставить после <text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/ ВОТ СЮДА }} Текст статьи с вики разметкой
чтобы имело вот такой вид:


<text xml:space="preserve">{{оригинал статьи|httр://ru.wikipedia.org/wiki/%D0%97%D0%B0%D0%B3%D0%BE%D0%BB%D0%BE%D0%B2%D0%BE%D0%BA }} Текст статьи с вики разметкой</text>

Помогите, ПОЖАЛУЙСТА! Программирование не знаю. А учить пхп ради одной задачи, нет времени.
 

DiMA

php.spb.ru
Команда форума
100 рублей мне на телефон и я напишу тебе рег :)
 

Фанат

oncle terrible
Команда форума
ага, а потом еще 1000 за объяснения, что с этим регом делать %)
 

phprus

Moderator
Команда форума
DiMA
Дамп русской википедии полтора гига занимает, так что тут без SAX парсера не обойтись. ;) А регом максимум сам тайтл проверять можно будет.
 

DiMA

php.spb.ru
Команда форума
тогда эту задачу можно решить через построчное чтение файла, следить за началом/концом текущего блока, результат писать в другой файл
у меня пхп легко конвертит гиговые базы
 

mp_petrol

Новичок
Всем смотреть решение http://www.softtime.ru/forum/read.php?id_forum=1&id_theme=62833
Добрый cheops помог
 

mp_petrol

Новичок
Помогите доработать скрипт
PHP:
<?php  
   // Устанавливаем не ограниченное время выполнения скрипта 
   set_time_limit(0); 
   // Открываем дамп 
   $fd = fopen("dump.txt", "rb"); 
   if(!$fd) exit("Файл отсутствует"); 
   // Открываем файл для разультата 
   $fp = fopen("result.txt", "a"); 
   if(!$fp) exit("Не возможности создать файл назначения"); 
   // Флаги состоянния 
   $found_page = false; 
   $found_title = false; 
   $found_article = false; 
   $title = ""; 
   $article = ""; 
   $arr = array("Файл:", "Изображение:", "Mediawiki:", "Википедия:"); 
   // Построчно анализируем файл 
   while($line = fgets($fd, 10000)) 
   { 
     if(!$found_page) 
     { 
       // Начало новой статьи пока не найдено 
       if(stripos($line, "<page>") !== false) 
       { 
         $found_page = true; 
         $title = ""; 
         $article = ""; 
       } 
     } 
     else 
     { 
       // Начало статьи найдено 
       if(!$found_title) 
       { 
         if(stripos($line, "<title>") !== false) 
         { 
           // Найден заголовок 
           $found_title = true; 
           // Извлекаем названия 
           $pattern = "|<title>(.*?)</title>|is"; 
           if(preg_match($pattern, $line, $out)) 
           { 
             $title = $out[1]; 
             // Игнорируем "Файл:", "Изображение:", "Mediawiki:", "Википедия:" 
             foreach($arr as $word) 
             { 
               if(stripos($line, $word) !== false) 
               { 
                 $found_page = false; 
                 $found_title = false; 
               } 
             } 
           } 
         } 
       } 
       else 
       { 
         if(!$found_article) 
         { 
           if(stripos($line, "<text") !== false) 
           { 
             $found_article = true; 
             $article .= $line; 
           } 
         } 
         else 
         { 
           $article .= $line; 
           if(stripos($line, "</text>") !== false) 
           { 
             $found_page = false; 
             $found_title = false; 
             $found_article = false; 
             // Оставляем запись в файле назначения 
             $pattern = "|<text[^>]+>(.*?)</text>|is"; 
             if(preg_match($pattern, $article, $out)) 
             { 
               fwrite($fp, "<page>    
 <title>".$title."</title>    
 <id>380248</id>    
 <revision>    
 <id>2097005</id>    
 <timestamp>2008-12-16T14:07:23Z</timestamp>    
 <contributor>    
 <username>mp_petrol</username>    
 <id>9835</id>    
 </contributor>    
 <minor />    
 <comment>Комментарий</comment> 
 <text xml:space=\"preserve\">{{Оригинал статьи|httр://ru.wikipedia.org/wiki/".rawurlencode($title).  
                   "}} $out[1]</text></revision>    
 </page>\r\n");            } 
           } 
         } 
       } 
     } 
   } 
   // Закрываем файлы 
   fclose($fd); 
   fclose($fp); 
 ?>
Проблема такая.
Почему то удаляются некоторые статьи. Если обработать файл со статьями, то в файле result.txt кроме статей с ключевыми заголовками отсутствуют еще много статей. И нет никакой закономерности. Вот перечень статей и минусами помечены те которые не попали в файл result.txt
  • - Изображение:Websphere logo.png
    F.
    - Изображение:Азиан Вэнс.jpg
    Влад IV Монах
    Static (альбом)
    Static
    EMI (значения)
    Даре, Жак
    Жак Даре
    - Медаль «За службу в подводных силах»
    Амбидекстр
    - Сеченово (Нижегородская область)
    EMI (физический термин)
    Вернер фон Фрич
    - Даре
    Сеченовский район
    - Изображение:Абдуллаев, Ровнаг Ибрагим оглы.jpg
    Контрреволюция
    Категория:Бад-Мускау
    - Медаль «За службу в Космических войсках»
    Alessandro Sommella
    - Стадион Десятилетия
    Кун, Якоб
    Федор Емельяненко
    - Исаакиевский мост
    Силья Лайн
    - - Нидерландский языковой союз
    Корнилов, Дмитрий Владимирович
    Маркерное кольцо
    - Шанигартен
    Харар
    Соммелла, Алессандро
    IEEE 802.5
    - Александровский уезд
    Сабры (цабарим)
    - Sommella, Alessandro
    Меньцзянь
    - - Пойковский 2008 (шахматный турнир)
    Гран-При Баку 2008 (Шахматный турнир)
А после этого я обработал только те файлы, которые были опущены. И все, кроме двух(помечены двумя минусами) попали в файл result.txt
Может кто попробует? Кусок дампа со статьями здесь http://www.softtime.ru/forum/files/62833-20090223194204.txt
 
Статус
В этой теме нельзя размещать новые ответы.
Сверху