Schrift
[thread]12509[/thread]

Regex vcf-Liste

Leser: 1


<< >> 7 Einträge, 1 Seite
catweasel
 2008-09-17 15:43
#114735 #114735
User since
2008-08-29
13 Artikel
BenutzerIn
[default_avatar]
Hi,

mit dieser Regex hole ich mir Namen und Handynummer aus einer vcf-Datei. Nach etwas "trail and error" funktioniert es, aber trotzdem möchte ich fragen, ob man diese Regex besser, schöner, kürzer oder sicherer schreiben kann.

Code (perl): (dl )
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
#! /usr/bin/perl -w
use strict;

open ( my $fh, '<', '/home/mm/Liste.vcf' ) or die "$!";
local $/;
my $file = <$fh>;
close ( $fh );


my $count = 0;
my%hash = ();
while ( $file =~ m/BEGIN:VCARD.*?\s+N:([^;]*;[^;]*;[^;]*;[^;]*;[^;]*?)\s+.*?TEL;TYPE=CELL[^:]*:(\+?\d+).*?END:VCARD/gs ) {
        my $key = $1;
        my $value = $2;
        my @namen = split ( /;/, $key );
                $key = "$namen[1] $namen[0]" if $namen[1] and $namen[0];
                $key = $namen[0] if ! $namen[1];
                $key = $namen[1] if ! $namen[0];
        $hash{$key} = $value if $key && $value;
}



foreach ( keys %hash ) {
        print $_, ' ',  '-' x ( 30 - length ( $_ ) ), ' ', $hash{$_}, "\n";
}

__DATA__
BEGIN:VCARD
VERSION:3.0
REV:2008-09-16T15:10:40Z
X-EVOLUTION-FILE-AS:Nachname\, Vorname
FN:Vorname Nachname
N:Nachname;Vorname;;;
TEL;TYPE=VOICE,OTHER:0123456789
TEL;TYPE=CELL,OTHER:0123456789
UID:pas-id-10AAAA1000000001
END:VCARD

BEGIN:VCARD
...
nepos
 2008-09-17 18:20
#114742 #114742
User since
2005-08-17
1420 Artikel
BenutzerIn
[Homepage] [default_avatar]
Hm, eventuell gehts mit Hilfe von CPAN:Text::vCard noch einfacher ;)
catweasel
 2008-09-17 21:57
#114749 #114749
User since
2008-08-29
13 Artikel
BenutzerIn
[default_avatar]
nepos+2008-09-17 16:20:49--
Hm, eventuell gehts mit Hilfe von CPAN:Text::vCard noch einfacher ;)


Das war mein erster Ansatz.
Leider bin ich mit der Dokumentation nicht zurecht gekommen.

Wie kann ich mit diesem Modul eine bestehende vcf-Datei einlesen?
MatthiasW
 2008-09-17 22:34
#114750 #114750
User since
2008-01-27
367 Artikel
BenutzerIn
[default_avatar]
Hast du dir die Dokumentation überhaupt mal angesehen?
Da steht, dass du mit dem Modul CPAN:Text::vCard::Addressbook arbeiten solltest um bsw. eine bestehende .vcf-Datei einzulesen.

MfG
perl -E'*==*",s;;%ENV=~m,..$,,$&+42;e,$==f;$"++for+ab..an;@"=qw,u t,,print+chr;sub f{split}say"@{=} me"'
leo11
 2008-09-17 23:50
#114751 #114751
User since
2008-08-14
250 Artikel
BenutzerIn
[default_avatar]
Bzgl. der Regex:
Den ;-Part könnte man zumindest mit etwas wie folgendem abkürzen:

([^;]*;){4}

Konzeptionell würde ich aber eher das File Zeile für Zeile durchlaufen und bei Treffern mit den Stichworten die Infos mit einer einfacheren Regex über $1 herausnehmen.

"Man sollte beachten, dass $1 von dem regulären Ausdruck nicht modifiziert wird, wenn er nicht matcht. In diesem Fall bedeutet es also, dass $1 noch auf einen Teil der vorherigen Zeile zeigt, wenn eine Zeile in der Datei falsches Format hat."
[Zitat betterworld] -> leicht abgewandelt
Hagen
 2008-09-18 11:22
#114755 #114755
User since
2007-09-06
233 Artikel
BenutzerIn
[default_avatar]
Es ist zwar keine sehr tolle Lösung aber vielleicht hilft das Skript von selfHTML ein (bisschen) weiter oder gibt ein paar neue Ideen:

http://www.selfhtml.net/cgiperl/sprache/objekte.htm#vcard_beispiel
Gruß
Hagen
catweasel
 2008-09-18 22:47
#114782 #114782
User since
2008-08-29
13 Artikel
BenutzerIn
[default_avatar]
leo11
Konzeptionell würde ich aber eher das File Zeile für Zeile durchlaufen und bei Treffern mit den Stichworten die Infos mit einer einfacheren Regex über $1 herausnehmen.


Hagen
Es ist zwar keine sehr tolle Lösung aber vielleicht hilft das Skript von selfHTML ein (bisschen) weiter oder gibt ein paar neue Ideen:

http://www.selfhtml.net/cgiperl/sprache/objekte.ht...


Jede Zeile einzulesen und alle Werte in ein Hash zu schreiben ist mir auch in den Sinn gekommen (nicht rechtzeitig).

Aber ich werd jetzt dem Modul eine zweite Change geben :-))

leo11
"Man sollte beachten, dass $1 von dem regulären Ausdruck nicht modifiziert wird, wenn er nicht matcht. In diesem Fall bedeutet es also, dass $1 noch auf einen Teil der vorherigen Zeile zeigt, wenn eine Zeile in der Datei falsches Format hat."
[Zitat betterworld] -> leicht abgewandelt


ging das nicht anders, oder fällt das in die Kategorie "it's feature, not a bug"

<< >> 7 Einträge, 1 Seite



View all threads created 2008-09-17 15:43.