ACCESS und CSV

Anfängerfragen zum Programmieren mit PureBasic.
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

ACCESS und CSV

Beitrag von Micro »

Hallo Leute,

hab' schon wie ein Wilder gesucht aber mal wieder nichts darüber gefunden.

Ich habe eine CSV-Datei, Felder getrennt mit ";". Die möchte ich in eine ACCESS-Datei hinzufügen. Das ist aber nicht das Problem.
Nun möchte ich, das beim Importieren geprüft wird, ob der Eintrag aus der CSV-Datei schon exestiert. Wenn ja, dann soll abgefragt werden, ob der Datensatz überschrieben werden soll. Wenn er aber noch nicht vorhanden ist, soll der Datensatz einfach eingefügt werden. Das Problem ist bei mehreren Satensätzen in der Database und in der CSV-Datei.

Ich habe es schon mit While-Schleifen ausprobiert (siehe Code), hat aber nix gebracht.

Code: Alles auswählen


  If ReadFile(1, "export.sql")
    While Eof(1) = 0
      Text.s = ReadString(1)
      String1.s = StringField(Text.s, 1, "|")
      String2.s = StringField(Text.s, 2, "|")

        DatabaseQuery(0, "select * from Liste")
        While NextDatabaseRow(0) 
          If GetDatabaseString(0,1) = String2.s
            Debug "Update"
            Debug "---"
          Else
            Debug "Insert"
            Debug "---"
          EndIf
        Wend
         Debug "Readfile"
        Debug "---"
     Wend
Hat jemand eine Lösung oder ein Lösungsansatz für mich?


Gruß aus Dortmund
Micro
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ACCESS und CSV

Beitrag von Kiffi »

wenn der Feldtrenner Deiner CSV-Datei das Semikolon ist, wieso splittest Du mit StringField() dann nach '|'?

Grüße ... Kiffi
a²+b²=mc²
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: ACCESS und CSV

Beitrag von Micro »

Hi Kiffi,
Kiffi hat geschrieben:wenn der Feldtrenner Deiner CSV-Datei das Semikolon ist, wieso splittest Du mit StringField() dann nach '|'?

Grüße ... Kiffi
sorry.... hast ja recht.
Da in den Daten der CSV-Datei i.d.R. auch innerhalb des Feldes u.U. ein Semikolon vorkommen kann, habe ich bei der CSV-Datei den "|" als Trenner genutzt. Normal ist das ja nicht, aber kennst das ja... Man(n) weiss nie, was die Leute so alles da reinschreiben. Bevor ich da wie wild anfangen muss zu slashen, hab' ich dann kurzerhand den "|" genutzt. In meinem Quelltext ist das also richtig dargestellt, nur in meinem Test falsch.. I'm so sorry.... :-)


Gruß Micro
PB 5.73 LTS - Win 11 Pro / 64Bit
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: ACCESS und CSV

Beitrag von Kiffi »

Kleiner Hinweis: Wenn das Feldbegrenzungszeichen im Feld selber vorkommt,
verwendet man normalerweise Textbegrenzer (beispielsweise Anführungsstriche).

Beispiel:

Code: Alles auswählen

Feld1;Feld2;"Dieses ist ; Feld3";Feld4;Feld5
Zu Deinem eigentlichen Problem:

Eine qualifizierte Aussage, ob ein Datensatz eingefügt werden muss, kannst Du erst treffen,
wenn Du die gesamte Schleife durchlaufen hast, ohne eine Übereinstimmung zu finden:

Code: Alles auswählen

DatabaseQuery(0, "select * from Liste")

Update = #False

While NextDatabaseRow(0) 
  If GetDatabaseString(0,1) = String2.s
    Update = #True
    Break
  EndIf
Wend

If Update = #True
 [...]
Else ; ansonsten -> Insert
 [...]
Endif
Eleganter lässt es sich allerdings lösen, wenn Du direkt mit Deinem String2 in der Abfrage arbeitest:

Code: Alles auswählen

Select Count(*) As Anzahl From Liste Where DeinDatenbankfeld = DeinString
Hier bekommst Du in Anzahl entweder eine 0 ( = Insert) oder ein größer 0 ( = Update) zurückgeliefert.

Noch'n Tick eleganter für reine Update-Anweisungen geht's mit:

Code: Alles auswählen

Update Liste Set ... Where DeinDatenbankfeld = DeinString
AmRandeBemerkt: Den Rückgabewert von DatabaseQuery() solltest Du prüfen und
abschließend auch noch ein FinishDatabaseQuery() ausführen.

Grüße ... Kiffi
Micro
Beiträge: 59
Registriert: 28.12.2006 17:44
Computerausstattung: Intel 10850K, 16GB RAM
div. andere Rechner...
Wohnort: Nordkirchen

Re: ACCESS und CSV

Beitrag von Micro »

Hi Kiffi,
Kiffi hat geschrieben:Kleiner Hinweis: Wenn das Feldbegrenzungszeichen im Feld selber vorkommt,
verwendet man normalerweise Textbegrenzer (beispielsweise Anführungsstriche).

Beispiel:

Code: Alles auswählen

Feld1;Feld2;"Dieses ist ; Feld3";Feld4;Feld5
Jo, kenne ich. Normal arbeite ich mit MySQL, DBMS ist also kein wirkliches Geheimnis :-)
Aber dabei haste noch das Problem, das wenn ein Benutzer ein oder mehrere Anführungszeichen im Text hat... Na, da musste doch wieder slashen :lol:
Kiffi hat geschrieben: Zu Deinem eigentlichen Problem:

Eine qualifizierte Aussage, ob ein Datensatz eingefügt werden muss, kannst Du erst treffen,
wenn Du die gesamte Schleife durchlaufen hast, ohne eine Übereinstimmung zu finden:

Code: Alles auswählen

DatabaseQuery(0, "select * from Liste")

Update = #False

While NextDatabaseRow(0) 
  If GetDatabaseString(0,1) = String2.s
    Update = #True
    Break
  EndIf
Wend

If Update = #True
 [...]
Else ; ansonsten -> Insert
 [...]
Endif
Man(n), das ist es! Hab's gerade ausprobiert, rennt nun :-) Hab' mal wieder den Wald vor lauter Bäume.... :roll:
Kiffi hat geschrieben: Eleganter lässt es sich allerdings lösen, wenn Du direkt mit Deinem String2 in der Abfrage arbeitest:

Code: Alles auswählen

Select Count(*) As Anzahl From Liste Where DeinDatenbankfeld = DeinString
Hier bekommst Du in Anzahl entweder eine 0 ( = Insert) oder ein größer 0 ( = Update) zurückgeliefert.
Werd' ich morgen auch mal ausprobieren. Ist aber auch logisch. Man muss nur berücksichtigen, dass das Feld "Anzahl" vom Typ LONG ist. Zur Not kann man es aber mit DatabaseColumnType ermitteln...
Kiffi hat geschrieben: Noch'n Tick eleganter für reine Update-Anweisungen geht's mit:

Code: Alles auswählen

Update Liste Set ... Where DeinDatenbankfeld = DeinString
Die Anweisung hatte ich drinne, keine Frage. Hab' es nur zur Ansicht entfernt...
Kiffi hat geschrieben: AmRandeBemerkt: Den Rückgabewert von DatabaseQuery() solltest Du prüfen und
abschließend auch noch ein FinishDatabaseQuery() ausführen.

Grüße ... Kiffi
Ahem... Arbeite noch mit 4.02. Hatte da letztens nen 1600er Code und den wollte ich nicht aufarbeiten :oops:

Aber (mal wieder) hast Du mir sehr sehr geholfen. Ich danke Dir für Deine Hilfe und noch mehr für Deine zündene Idee !!!!

Gruß aus Dortmund
Micro
PB 5.73 LTS - Win 11 Pro / 64Bit
Antworten