Parsowanie spisu imienin

Potrzebowałem – potrzebuje:) bo wciąż jeszcze tego nie zrobiłem – tabele SQL z imieninami – imię i data jego imienin. Oczywiście potrzebowałem danych – to akurat było bardzo proste, odpowiedni spis znalazłem na Wikipedii

Mogłem szukać dalej i znaleźć coś łatwiejszego do parsowania, ale pomyślałem, że to przerobienie tego spisu będzie dość proste. I w sumie tak było.

Niewiele więc myśląc skopiowałem tekst strony i wkleiłem do pliku imiona.txt. Pierwszy problem – pozbyć linii – nie zawierających imion:

(...)
    * Aurelian — 4 lipca, 25 września
    * Aureliusz — 9 września, 13 września, 16 listopada


   (wróć do indeksu)

B [edytuj]

    * Balbin — 21 grudnia
    * Balbina — 31 marca, 2 grudnia
(...)

Wystarczyło wklepać w konsoli:

Tak, teraz trzeba było tylko sparsować plik tmp.txt - wymęczyłem w końcu skrypt:

{geshi lang=bash num=true}#!/usr/bin/env python #-*- coding: utf-8 -*- import re pat_name = re.compile(' *\* (?P.*) — ') month = { "stycznia":0, "lutego":1, "marca":2, "kwietnia":3, "maja":4, "czerwca":5, "lipca":6, "sierpnia":7, "września":8, "października":9, "listopada":10, "grudnia":11 } try: inFile = open("tmp.txt") for line in inFile: tmp = pat_name.search(line) if tmp: # Usuwanie \n line = line[:-1] # Usuwanie ostatniego znaku - o ile jest if line[-1:] == ',' or line[-1:] == '.': line = line[:-1] # Wydzielenie dat strdate = line.split(' — ')[1] # Wydzielamy imiona names = tmp.group('name').split(', ') if len(names) == 1: names = names[0].split(',') # Rozdzielamy daty dates = strdate.split(',') # Uzyskane wyniki - imiona: for name in names: print name # - daty ich imienin for date in dates: if date[0] == ' ': date = date[1:] print "data:", date, month[date.split(' ')[1]] finally: inFile.close()

Zadziało, zamieszczony skrypt jeszcze nie generuje skryptu SQL, ale to już tylko kwestia wklepywania danych do pliku miedzy odpowiednimi tekstami

Inne kwestie:

  • Po co to zamieszczam? Jako przykład – działa, a może się nawet komuś przydać. Z analizy cudzego kodu o którym wiemy, że jest poprawny, można się dowiedzieć paru rzeczy.
  • Spis z Wiki nie był idealny, tu brak spacji, tu przecinek za dużo itp – stąd jest w skrypcie klika dodatkowych ifów i nieco dziwne rozwiązania.
  • A.. miesiące mają przyporządkowane numery od 0 – to chyba akurat widać.

9 thoughts on “Parsowanie spisu imienin

  1. Ja tam nie wiem, ale 40 linii to trochę za dużo na taką operację.

    wget -o /dev/null -O – http://pl.wikipedia.org/wiki/Imieniny | perl -nle ‘next unless s[^<li><a href=.*?>(.*?)</a>][]; $i = $1; @b = m[<a href=.*?>(.*?)</a>]g; $" = " | "; print "$i: @b"’ | iconv -f utf8 -t //translit | less -S

    Jako zadanie domowe zostawiam dorobienie zamiany nazw miesięcy na cyfry i wypisywanie tego w bardziej zjadliwym formacie.

    Like

  2. @dozzie:

    Chylę czoła. Naprawdę niezła robota. Jestem pod wrażeniem.

    Mała uwaga: trzeba też sobie poradzić z takimi wpisami:

    (…)
    Afrodyzja: Afrodyzjusz
    Afrodyzjusz: Afrodyzy | Afrodyzja | 14 marca | 28 kwietnia | 30 kwietnia
    (…)

    Like

Comments are closed.