Seite 1 von 1

[GELÖST] - vCard in Datenbank importieren

Verfasst: 18.09.2012 02:36
von Micro
Hallo Leute,

ich möchte gerne eine vCard-Datei in eine Access-Datenbank importieren. Das Problem mit UTF-8 habe ich schon gelöst.
Mein Problem ist, das manche Zeilen nicht in jeder vCard vorhanden sind. Hier ein Beispiel:

Code: Alles auswählen

BEGIN:VCARD
VERSION:2.1
N:Nachname;Vorname
TEL;HOME:000000
TEL;WORK:111111
TEL;CELL:111111
EMAIL:mail@domain.loc
BDAY:2013-08-25T11:00
END:VCARD

BEGIN:VCARD
VERSION:2.1
N:Nachname;
TEL;HOME:333333
END:VCARD
Nun stehe ich auf dem Schlauch, wie ich das differenzieren kann, siehe Zeile "TEL;CELL".
Wer kann mir da helfen?


Gruß aus Dortmund

Frank

Re: vCard in Datenbank importieren

Verfasst: 18.09.2012 07:31
von jamirokwai
Hi,

Beispiel TEL;HOME:000000

Ich würde:
1. die Zeile mit FindString "interpretieren", und nach TEL; durchsuchen.
2. mit StringField HOME und 000000 trennen
3. den ersten Teil interpretieren und entsprechend den zweiten Teil in HOME oder WORK oder so speichern

Das geht am Besten in einer Struktur, die alle Daten enthält, und die du für neue vCards leerst.
Beim Wegspeichern übergibst du dann alle Daten an die Datenbank.

Klar soweit? :-)

Gruß
Jamirokwai

Re: vCard in Datenbank importieren

Verfasst: 18.09.2012 10:12
von Micro
Tach auch,
jamirokwai hat geschrieben:Das geht am Besten in einer Struktur, die alle Daten enthält, und die du für neue vCards leerst.
Beim Wegspeichern übergibst du dann alle Daten an die Datenbank.
dummerweise spuckt das Telefon die vCard nur in dieser Form aus. Ich muss ja die vorhandene vCard in das neue Programm importieren, damit es weiterverarbeitet werden kann.

Mein Problem ist nun, dass wenn eine Zeile 'nicht' vorhanden ist, diese trotzdem mit einem leeren String zu übergeben. Die vorhandenen Zeilen habe ich ja auch genauso ausgelesen, wie Du vorgeschlagen hast.
Anhand der o.g. vCard sollte das Ergebnis so aussehen:

Code: Alles auswählen

('Nachname', 'Vorname', '000000', '111111', '111111', 'mail@domain.loc', '2013-08-24T11:00*'),
('Nachname', '', '333333', '', '', '', '')
Leider sieht es aber so aus:

Code: Alles auswählen

('Nachname', 'Vorname', '000000', '111111', '111111', 'mail@domain.loc', '2013-08-24T11:00*'),
('Nachname', '', '333333',
Der Rest ist einfach nicht mehr da!

Gruß Frank

Re: vCard in Datenbank importieren

Verfasst: 18.09.2012 11:36
von Bisonte
jamiro meint es wohl auf diese Weise :

Code: Alles auswählen

Structure struct_vCard
  
  Version.s
  Nachname.s
  Vorname.s
  TelHome.s
  TelWork.s
  TelCell.s
  Email.s
  BDay.s
  
EndStructure

NewList vCardData.s() ; die gerade eingelesene vCard
NewList vCardSQL.struct_vCard() ; Die nach SQL zu portierende vCard

; Die Erste vCard

; AddElement(vCardData()) : vCardData() = ""
; AddElement(vCardData()) : vCardData() = "BEGIN:VCARD"
; AddElement(vCardData()) : vCardData() = "VERSION:2.1"
; AddElement(vCardData()) : vCardData() = "N:Nachname;Vorname"
; AddElement(vCardData()) : vCardData() = "TEL;HOME:000000"
; AddElement(vCardData()) : vCardData() = "TEL;WORK:111111"
; AddElement(vCardData()) : vCardData() = "TEL;CELL:111111"
; AddElement(vCardData()) : vCardData() = "EMAIL:mail@domain.loc"
; AddElement(vCardData()) : vCardData() = "BDAY:2013-08-25T11:00"
; AddElement(vCardData()) : vCardData() = "End:VCARD"

; die zweite

AddElement(vCardData()) : vCardData() = "BEGIN:VCARD"
AddElement(vCardData()) : vCardData() = "VERSION:2.1"
AddElement(vCardData()) : vCardData() = "N:Nachname;"
AddElement(vCardData()) : vCardData() = "TEL;HOME:333333"
AddElement(vCardData()) : vCardData() = "End:VCARD"

; Megasimple Stringoperationen

ClearList(vCardSQL())

AddElement(vCardSQL())
ForEach vCardData()
  
  Dat.s = StringField(vCardData(), 1, ":")
  Com.s = Mid(vCardData(), FindString(vCardData(),":")+1)
  
  Select Dat
    Case "N"
      vCardSQL()\Nachname = StringField(Com,1,";")
      vCardSQL()\Vorname  = StringField(Com,2,";")
    Case "TEL;HOME"
      vCardSQL()\TelHome = Com
    Case "TEL;WORK"
      vCardSQL()\TelWork = Com
    Case "TEL;CELL"
      vCardSQL()\TelCell = Com
    Case "EMAIL"
      vCardSQL()\Email = Com
    Case "BDAY"
      vCardSQL()\BDay = Com
  EndSelect
  
Next
tr.s = Chr(96) ; MySql "Gänsefuss"

SQL.s = "("+tr+vCardSQL()\Nachname+tr+", "+tr+vCardSQL()\Vorname+tr+", "
SQL   + tr + vCardSQL()\TelHome + tr + ", "
SQL   + tr + vCardSQL()\TelWork + tr + ", "
SQL   + tr + vCardSQL()\TelCell + tr + ", "
SQL   + tr + vCardSQL()\Email + tr + ", "
SQL   + tr + vCardSQL()\BDay + tr + ")"
Debug SQL

[GELÖST] vCard in Datenbank importieren

Verfasst: 19.09.2012 00:36
von Micro
Tach zusammmen,

jetzt habe ich es kapiert. Mann, ich dachte nicht mehr an den Befehl "NewList", obwohl das ja naheliegend ist.
Martin, ich habe Dein Quellcode übernommen und in eine Schleife untergebracht. Jetzt laufen alle vCards nacheinander durch und werden entsprechend in die Tabelle eingetragen. Sooo wollte ich das haben :-)

Zwei Informationen dazu noch: Man(n) sollte nach den ersten Schreifendurchlauf einen "ClearList(vCardData())" einfügen. Zudem braucht der "FindString"-Befehl einen 3. Parameter. Eine "0" ist da sehr hilfreich :-)

Ich danke Euch beide recht herzlich für Eure Hilfe. Alleine wäre ich da nicht drauf gekommen!


Viele Grüße aus Dortmund

Frank

Re: [GELÖST] vCard in Datenbank importieren

Verfasst: 19.09.2012 00:41
von Kiffi
<OT>
Micro hat geschrieben:Zudem braucht der "FindString"-Befehl einen 3. Parameter.
bei Dir. Bei uns nicht mehr. ;-)

</OT>

Re: [GELÖST] - vCard in Datenbank importieren

Verfasst: 19.09.2012 12:38
von Micro
Sry, hatte meine Sig noch nicht aktualisiert. :oops:
Ich nutze auch die 4.61, aber in der Help stand nicht explizit, das der Startposition Parameter optional ist :praise:


Gruß aus Dortmund,

Frank

Re: [GELÖST] - vCard in Datenbank importieren

Verfasst: 19.09.2012 12:55
von Danilo
Micro hat geschrieben:Ich nutze auch die 4.61, aber in der Help stand nicht explizit, das der Startposition Parameter optional ist :praise:
In der englischen Version steht es:
FindString()

Syntax

Position = FindString(String$, StringToFind$ [, StartPosition])

Description

Try to find the 'StringToFind$' within the given 'String$' starting from the given 'StartPosition'.
If 'StartPosition' is not specified, the default is 1.
If the string is found, its position is returned (in its offset, starting from 1). If the string is not found, it returns 0.

Code: Alles auswählen

  Debug FindString("PureBasic", "Bas", 1) ; will display 5
Supported OS

All
In der deutschen Hilfe steht es wirklich nicht. Da muss André wohl nachbessern,
wenn die deutsche Hilfe so hinterher hinkt.

Re: [GELÖST] - vCard in Datenbank importieren

Verfasst: 20.09.2012 08:12
von Micro
Moin,
In der deutschen Hilfe steht es wirklich nicht. Da muss André wohl nachbessern,
wenn die deutsche Hilfe so hinterher hinkt.
Hmmm, da ich ja diesbezüglich mir ein wenig leicht mache, lese ich in der Tat immer nur die deutsche Hilfe.
Ich muss auch mal nachsehen, was sich sonst noch alles getan hat. Ich denke mir, dass ich mir das bestimmt dann leichter machen kann :mrgreen:

Gruß Frank