Parsowanie spisu imienin #2

Swego czasu ‘popełniłem’ jeden mały skrypt na użytek własny, który miał mi przerobić listę imienin ściągniętą z Wikipedii (strona: Imieniny) na zbiór zapytań SQL, które potrzebne mi były do jednego projektu. Patrząc z perspektywy czasu napisałem mały koszmarek.

Mimo to, w końcu to nieświadomie, miałem kilka wejść ludzi którzy poszukiwali następujących fraz:

  • skrypt imienin
  • sql z imieninami
  • linux imieniny
  • imiona.txt
  • szablon daty imienin
  • imieniny daty
  • imieniny.sql
  • spis imienin
  • itp…

To właśnie zapotrzebowanie czytelników, choć być może i jednorazowych, skłoniło mnie, w ramach ćwiczeń z Pythonem, do ucywilizowania mojego dzieła. Z marnych 40 linii kodu powstało ich jakieś 200 (ściślej, wliczając komentarze i puste linie 250). Ale mimo to uważam go za lepszy. Przede wszystkim wiem więcej o wyrażeniach regularnych, a kod jest obiektowy, przez co łatwo jest – mam nadzieję – dostosować go do indywidualnych potrzeb użytkownika.

Przykłady uruchomienia

Zamieszczam przykładowe wyniki działania mojego najnowszego dziecka:

Ogólna zasada działania

Ponieważ nie wiem, jaką kto założył sobie bazę danych, jakie ma w niej tablice i relacje między nimi, nie napisałem klasy generującej SQL, ale zakładam, że na podstawie opisów oraz przykładów i przy odrobinie smykałki do Pythona łatwo będzie uzyskać to co tam się komu wymarzy.

Nie mniej jednak oto i krótki kurs: klasą która dostaje i formatuje dane na koniec, jest jakiś potomek klasy AbstractLineParser. Ważne jej metody, które należy przeciążyć to: _setNames oraz _setDates. Należy pamiętać, iż obie dostają jako parametry listy (bo jedno imię zwykle ma wiele dat, a imię też może występować w odmianach). Zawsze też dostaje się najpierw imiona, a potem daty do nich. Resztę można wywnioskować samemu, albo przebrnąć przez komentarze.

Kod skryptu można zobaczyć, lub pobrać z tego oto linka

Słowo końcowe

Cóż, moje testowanie błędów nie wykazało, jednak przestrzegam, przed imieniem: “Apollo(n)” (to chyba jedyny taki przypadek). Ignorowane też są imiona, z których czytelnik został odesłany – np. Adelgunda, zob. Adalgunda. Nie zabraniam modyfikacji, nawet zachęcam, nie biorę odpowiedzialności za wszelakie zło wyrządzone przez ten skrypt (no bez przesady, to tylko trochę kodu w Pythonie).

Na końcu chciałem podziękować (w kolejności chronologicznej): tym którzy komentowali mój poprzedni post, bo ich rady jakoś tam się przydały, następnie mojej Pani, która bez wątpienia zna się na Pythonie lepiej niż ja – bez złośliwości, wiem że to nie jest trudne – za pomoc.