Nie jesteś zalogowany.
Jeśli nie posiadasz konta, zarejestruj je już teraz! Pozwoli Ci ono w pełni korzystać z naszego serwisu. Spamerom dziękujemy!

Ogłoszenie

Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.

#1  2013-10-06 18:10:37

  grzesko - Nowy użytkownik

grzesko
Nowy użytkownik
Zarejestrowany: 2013-09-02

Perl - regex - filtrowanie pliku z numerami telefonów

Dzień dobry. Na wstępie dodam, że przygodę z perlem dopiero zaczynam. Chciałbym odfiltrować plik z kontaktami (plik typowy dla oprogramowania telefonów SE) tak by wynik wyglądał mniej więcej tak:
[dynamiczna długość nazwy] [spacja] [numer telefonu]
Anna Kowalska Dom 723000000

plik z kontaktami wygląda mniej więcej tak:

Kod:

BEGIN:VCARD
VERSION:2.1
N:min. za 8;200
FN:200 min. za 8
TEL;CELL:*121*11*07#
X-IRMC-LUID:000200004ABA
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:smsow 5zl;500
FN:500 smsow 5zl
TEL;CELL:*121*11*09#
X-IRMC-LUID:000200005D89
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:Cz.;Abc
FN:Adam XXXXXXX
TEL;CELL:723000000
X-IRMC-LUID:0002000061B6
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:Adam
FN:xxxxxx xxx Adam
TEL;CELL:697000000
X-IRMC-LUID:000200004466
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:xxx xxx xxx Agnieszka
FN:Agnieszka xxxx xxx xxx
TEL;CELL:413000000
X-IRMC-LUID:00020000456A
END:VCARD
BEGIN:VCARD
VERSION:2.1
N:W;Agnieszka
FN:Agnieszka W
TEL;CELL:693000000
X-IRMC-LUID:000200002BED
END:VCARD

W pliku interesują nas elementy:
    * FN:adresat [\word]
    *TEL;CELL:nr_telefonu [.* dowolne znaki #[0-9] itp.]

A o to co sam wykombinowałem:

Kod:

#!/usr/bin/perl
use warnings;
use strict

open FILE, "telef.txt" or die $!;
while (my $line = <FILE>){
    if ($line =~ m!FN:(\w+)! ){
        print $1 . " ";
    }
    if ($line =~ m!CELL:(.*)! ){
       print $1 . "\n";
    }    
}

Mój problem polega na tym, że nie jest wyłapywana całą nazwa osoby, do której należy telefon tylko pierwszy człon nazwy np. imie.
Dodam, że jeśli zrobię wyświetlanie pełnej nazwy (dynamicznej) i wyświetlanie numeru w całej linie wszystko działa ok.
działający kod z wyświetlaniem adresata i numeru w osobnych wierszach:

Kod:

#!/usr/bin/perl
use warnings;
use strict;

open FILE, "telef.txt" or die $!;
while (my $line = <FILE>){
    if ($line =~ m!FN:(\w.*)! ){
        print $1 . "\n";
    }
    if ($line =~ m!CELL:(.*)! ){
       print $1 . "\n";
    }    
}

Prosiłbym o udzielenie wskazówek jaki popełniam błąd.

Offline

 

#2  2013-10-07 10:58:55

  milyges - inż.

milyges
inż.
Skąd: Gorlice/Kraków
Zarejestrowany: 2006-04-09
Serwis

Re: Perl - regex - filtrowanie pliku z numerami telefonów

To najzwyklejszy vCard, użyj gotowej biblioteki, np.: http://packages.debian.org/pl/squeeze/libtext-vcard-perl

Offline

 

#3  2013-10-07 16:33:20

  grzesko - Nowy użytkownik

grzesko
Nowy użytkownik
Zarejestrowany: 2013-09-02

Re: Perl - regex - filtrowanie pliku z numerami telefonów

Dziękuję za podesłanie mi biblioteki.
Pokaże co mi się udało osiągnąć a z czym nadal mam problem:

Kod:

#!/usr/bin/perl
use strict;
use warnings;
use Text::vCard::Addressbook;

my $address_book = Text::vCard::Addressbook->new(
{ 'source_file' => '/home/xxxxx/telef.txt', } );

$address_book->set_encoding('utf-8');

foreach my $vcard ( $address_book->vcards() ) {
    print $vcard->fullname() . " " . $vcard->get('tel') . "\n";
}

czego wynikiem jest:

Kod:

[adresat] [numer telefonu]
Uxxxxx  ARRAY(0x85a081c)
Wxxxx ARRAY(0x85a0dd0)
Wxxxx  ARRAY(0x85a1384)
wixx ARRAY(0x85a2364)
Kxxx ARRAY(0x85a2918)
Zxxxxx ARRAY(0x85a2ecc)
Zxxxx ARRAY(0x85a3eb4)
Wxxxxx ARRAY(0x85a4468)
Zxxxxxx ARRAY(0x85a4a44)

Mam problem z dostaniem się do numeru telefonu. Zamiast tego zwracana jest tablica ale jak się do niej dostać?
Mógłbym też odczytywać numery metodą z wcześniejszego wpisu ( regex'em), ale wolałbym już korzystać z tej podesłanej biblioteki.

Znalazłem w googlach pare przykładów i nie wiem dlaczego ale zauważyłem dziwną zależność, że inne pliki VCard mają klucze podzielone na 'home' i 'work'. Natomiast w moim pliku ( oryginalnie utworzonego przez telefon ) wszystkie klucze (nr telefonów) zawierają klucz TELL;CELL: (nie TELL;HOME lub TELL;WORK). Myślę, że w tym momencie ta biblioteka nie zadziała.
Czy ma ktoś jeszcze jakiś pomysł jak sobie poradzić z tym problemem ?

Ostatnio edytowany przez grzesko (2013-10-07 17:45:30)

Offline

 

Stopka forum

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson
To nie jest tylko forum, to nasza mała ojczyzna ;-)