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!
Prosimy o pomoc dla małej Julki — przekaż 1% podatku na Fundacji Dzieciom zdazyć z Pomocą.
Więcej informacji na dug.net.pl/pomagamy/.
Strony: 1
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:
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:
#!/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:
#!/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
To najzwyklejszy vCard, użyj gotowej biblioteki, np.: http://packages.debian.org/pl/squeeze/libtext-vcard-perl
Offline
Dziękuję za podesłanie mi biblioteki.
Pokaże co mi się udało osiągnąć a z czym nadal mam problem:
#!/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:
[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
Strony: 1