[C#] Regex en Vcards

Pagina: 1
Acties:
  • 130 views sinds 30-01-2008
  • Reageer

Onderwerpen


Acties:
  • 0 Henk 'm!

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 10:54
Ik probeer om VCards die via bluetooth zijn binnen gekomen om die uit te lezen en op te slaan. Dit had ik eerst gedaan via stukken tekst opzoeken en lezen tot ;. Nu gaat dat heel vaak mis omdat veel gsm's verschillende vcards sturen (verschillen volgorde).

Nu had ik een vcard reader gevonden op Code project en die werkt bijna helemaal. Ik zit vast op het ophalen van de naam.

Heb als voorbeeld 2 verschillende vcards (van collega en mij)
code:
1
BEGIN:VCARD\r\nVERSION:2.1\r\nN;ENCODING=QUOTED-PRINTABLE:Van=20de=20Korput;Roy;;;\r\nTEL;CELL:0611111\r\nEMAIL:blaat@blaat.com\r\nEND:VCARD\r\n

code:
1
BEGIN:VCARD\r\nVERSION:2.1\r\nN:achternaam;voornaam\r\nTITLE:Programmer\r\nORG:bedrijf B.v.\r\nTEL;CELL:0611111\r\nEMAIL;INTERNET;PREF:blaat@blaat.com\r\nURL:http://www.google.com\r\nADR;HOME:;;;plaats;;;Netherlands \r\nBDAY:19830103\r\nX-IRMC-LUID:000200000000\r\nEND:VCARD\r\n


daar laat ik op los:
C#:
1
2
3
4
5
6
7
8
9
10
11
RegexOptions options = RegexOptions.IgnoreCase | RegexOptions.Multiline | RegexOptions.IgnorePatternWhitespace;
regex = new Regex(@"(\n(?<strElement>(N))) (;*(?<strAttr>(ENCODING=QUOTED-PRINTABLE))) (:(?<strSurname>([^;]*))) (;(?<strGivenName>([^;]*)))  (;(?<strMidName>([^;]*))) (;(?<strPrefix>([^;]*))) (;(?<strSuffix>[^\n\r]*))", options);
m = regex.Match(s);
if (m.Success)
 {
       Surname = m.Groups["strSurname"].Value;
       GivenName = m.Groups["strGivenName"].Value;
       MiddleName = m.Groups["strMidName"].Value;
       Prefix = m.Groups["strPrefix"].Value;
       Suffix = m.Groups["strSuffix"].Value;
}


de eerste gaat goed. De 2e niet, dit komt vanwege de niet gegeven ';'.
\nN;ENCODING=QUOTED-PRINTABLE:Van=20de=20Korput;Roy;;;\r\n
\nN:achternaam;voornaam\r\n


Ik kom er maar niet uit om dit af te vangen. Heeft iemand een idee om dit af te vangen :?

Probeer steeds verschillende regex commando's via Expresso

[ Voor 3% gewijzigd door PoweRoy op 05-11-2007 14:50 ]

[This space is for rent]


Acties:
  • 0 Henk 'm!

  • Hoogie2004
  • Registratie: Mei 2005
  • Laatst online: 17-09 23:45

Hoogie2004

Whohooooo

Als je alleen deze 2 vcard opties hebt zou ik 2 regex dingen schrijven, en dan door allebei halen. Misschien niet de netste oplossing, maar wel de makkelijkste.

ik heb geen idee of het kan, maar anders misschien die groep afsluiten op het newline teken?

ps. ik heb je regex eens geprobeerd in Expresso en ik krijg voor beide vcards geen match, maar ik zal wel ergens iets fout doen.

[ Voor 14% gewijzigd door Hoogie2004 op 06-11-2007 11:52 ]

My iRacing profile | Strava


Acties:
  • 0 Henk 'm!

  • PoweRoy
  • Registratie: April 2002
  • Laatst online: 10:54
Nou heb deze twee op dit moment maar er zijn nog meer gsm's dan deze twee. Door middel van regex wilde ik het voor mekaar krijgen dat het (bijna) altijd werkt.

Over je test in expresso, vergeet niet 2x \ tedoen ;) had het zelfde probleem hierook.
code:
1
(\\n(?<strElement>(N))) (;*(?<strAttr>(ENCODING=QUOTED-PRINTABLE)))? (:(?<strSurname>([^;]*)))  (;(?<strGivenName>([^;]*))) (;(?<strMidName>([^;]*))) (;(?<strPrefix>([^;]*))) (;(?<strSuffix>[^\\n\\r]*))

[This space is for rent]


Acties:
  • 0 Henk 'm!

  • Hoogie2004
  • Registratie: Mei 2005
  • Laatst online: 17-09 23:45

Hoogie2004

Whohooooo

Het basisprobleem blijft dat niet alle telefoons schijnbaar dezelfde tekens gebruiken voor het delimiten. Dit is erg vervelend en als ik die twee dingen bekijk, heb ik het idee dat een geschikte regex bijna onmogelijk te schrijven valt omdat er zoveel verschillen zitten in de 2 cards (er staat bij beide cards wel dat het versie 2.1 is, maar dat er zoveel verschil in de standaard toegelaten word is een beetje dubbel.)

wat voor type zijn de telefoons als ik vragen mag (en dan voornamelijk het OS wat erop draait, WM5/6 of symbian ofzo?)

Ik ga nog even verder kijken

Na klein beetje zoekwerk vond ik deze convertor naar CSV. (heb geen vcard files anders zou ik er eens naar kijken)
http://labs.brotherli.ch/vcfconvert/

(je kan ook het script downloaden)
Misschien dat deze CSV's gemaakt van verschillende vCards meer op elkaar lijken (je kan dan als het goed is gewoon alle dingen uit die csv halen)

[ Voor 33% gewijzigd door Hoogie2004 op 06-11-2007 14:29 ]

My iRacing profile | Strava


Acties:
  • 0 Henk 'm!

  • Jaap-Jan
  • Registratie: Februari 2001
  • Laatst online: 07:06
Er is maar één delimiter voor velden, de puntkomma ';'. Echter is alleen het 1e veld verplicht. Misschien dat dit duidelijk maakt hoe een property is opgebouwd:

code:
1
PropertyName [';' PropertyParameters] ':' PropertyValue
De property parameters zijn optioneel. Alle property names, property parameters en de values van de property parameters zijn case-insensive.

In dit geval is de PropertyName 'N'. De PropertyValue van 'N' bestaat uit maximaal 5 velden:
• Family Name (verplicht)
• Given Name
• Additional Names
• Name Prefix
• Name Suffix

Alleen de eerste is verplicht, de rest is optioneel. De velden worden gescheiden door puntkomma's.

Bij de eerste is de property parameter 'ENCODING' ingesteld op 'QUOTED-PRINTABLE'. Bij de tweede niet en dan is 'ENCODING' standaard '7BIT'. De charset is bij beiden 'ASCII' en als je base64 encoded utf-8 had willen hebben, dan zag het er zo uit:
code:
1
N;ENCODING=BASE64;CHARSET=UTF-8:dmFuIGRlciBWZWVu;SmFhcC1KYW4=
Maar De property parameter namen mogen ook worden weggelaten als dit geen ambiguïteit oplevert. Dit is ook geldig:
code:
1
N;BASE64;UTF-8:dmFuIGRlciBWZWVu;SmFhcC1KYW4=


Misschien dat dit helpt, een linkje naar de vCard 2.1 specificaties: http://www.imc.org/pdi/vcard-21.rtf

[ Voor 16% gewijzigd door Jaap-Jan op 06-11-2007 15:03 ]

| Last.fm | "Mr Bent liked counting. You could trust numbers, except perhaps for pi, but he was working on that in his spare time and it was bound to give in sooner or later." -Terry Pratchett