lut 14

Powiedzmy że mamy już te ponad 200 tysięcy plików na dysku. Przystępujemy do procesu parsowania, który wydaje mi się najtrudniejszy i najbardziej wrażliwy na choćby drobne zmiany formatu pliku źródłowego.
W Perlu można skorzystać z modułów ułatwiających wyciąganie czystego tekstu z plików .html, na przykład HTML::Parser, niestety nie jest to specjalnie elastyczna metoda (bez ekwilibrystyki). Postanowiłem zrobić wszystko ręcznie i krok po kroku. Na początek otwieramy sobie plik .html:

$plik_html="html/".$numer.".html";
open(HTML, '< ' , $plik_html);
@tablica = ;
close (HTML);

Po otwarciu zawartość pliku jest przepisywana wiersz po wierszu do tablicy. Dostęp do danych staje się łatwy. Teraz pętla usuwająca tagi html’a i konwertująca polskie znaki:

#interesujace dane znajduja sie od 72 do 20 od konca tabeli
for ($i=72; $i < = $#tablica-20; $i++)
{
@tablica[$i]=~ s/<(?:[^>'"]*|(['"]).*?\1)*>/ /gs; #wywalami tagi html'a
@tablica[$i]=~ s/& n b s p ;/ /g; #zamieniamy twarde spacje na spacje w ascii
@tablica[$i]=~ s/& q u o t ;//g; #kasujemy cudzyslow

@tablica[$i] =~ s/\/t/ /g; #zamieniamy tabulacje na spacje
@tablica[$i] =~ s/^\s+//; #kasujemy spacje z przodu wiersza
@tablica[$i] =~ s/\s+$//; #kasujemy spacje z tyłu wiersza
@tablica[$i] =~s/( )\1+/$1/g; #kasujemy powtarzajace sie spacje

#korekta polskich znaków z utf8 na iso-8859-2
@tablica[$i] = utf8(@tablica[$i]);
@tablica[$i] = $str_latin2->from_unicode(@tablica[$i]->utf16);
#jeszcze drobne korekty diakrytyczne
@tablica[$i]=~ s/& # 2 1 1 ;/Ó/g; #aby przeglądarka internetowa nie interpretowała...
@tablica[$i]=~ s/& # 2 4 3 ;/ó/g; #...kodowanych znaków (np. Ó) wstawiłem spacje!

Ady dokonywać konwersji polskich znaków w ten sposób trzeba sobie przygotować wcześniej metodę:

use Unicode::Map();
use Unicode::String qw(utf8 utf16);
$str_latin2 = new Unicode::Map("ISO-8859-2");

Teraz dla wygody warto przepisać sobie niepuste wiersze obrabianej tablicy do nowe tablicy:

if (length(@tablica[$i]) > 0)
{
push (@dane,@tablica[$i]);
}

Zbieranie danych z tak przygotowanej tablicy nie będzie stanowiło wielkiej trudności. Format jest stabilny, zmienia się tylko ilość wierszy kiedy wpis do KRS-u posiada długą nazwę, długi opis sposobu reprezentacji oraz przy datach wpisania i wykreślenia z rejestru. Koniec tablicy to zawsze dane osób reprezentujących. A więc sprawę załatwiają instrukcje tego typu (czasami warunkowo zapętlone):

$numer=substr(@dane[1],10,length(@dane[1]))."\n"; #numer KRS

Skrypt całego parsera jest nudny, zamieszczę go na końcu jako finalny program. Tymczasem przychodzi czas wprowadzenia danych do bazy.


Podobne posty:


Leave a Reply