CSV-Datei in DBF einlesen [ERLEDIGT]

Zugriff, Engines, Konvertierung. Von ADS über DBF bis zu SQL.

Moderator: Moderatoren

Antworten
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

CSV-Datei in DBF einlesen [ERLEDIGT]

Beitrag von peternmb »

Hallo,

irgendwie stehe ich anscheinend auf dem Schlauch, und die Dokumentation ist da nicht sehr hilfreich.
die Datei test.csv sieht so aus:

ARTNR;ARTNAME;VKCENT;EKCENT
A4711;Testartikel 1;1000;111
A4712;Testartikel 2;2000;222
A4713;Testartikel 3;3000;333
die Datei ware.dbf hat eine passende Structur:

ART_NR C 20 0
ART_NAME C 20 0
VK N 10 2
EK N 10 2
nur wie lese ich die CSV in die DBF-Datei ein? Mein Versuch funktioniert nicht:

Code: Alles auswählen

file="test.csv"

// Umlaute korrigieren
datei := MemoRead(file)
datei:=strTran(datei,chr(196),chr(142))   // Ä
datei:=strTran(datei,chr(228),chr(132))   // ä
datei:=strTran(datei,chr(214),chr(153))   // Ö
datei:=strTran(datei,chr(246),chr(148))   // ö
datei:=strTran(datei,chr(220),chr(154))   // Ü
datei:=strTran(datei,chr(252),chr(129))   // ü
datei:=strTran(datei,chr(223),chr(225))   // ß
memowrit( file,datei )

DbeInfo( COMPONENT_DATA, DELDBE_MODE, DELDBE_MULTIFIELD )
DbeInfo( COMPONENT_DATA, DELDBE_FIELD_TOKEN, ";" )
DbeInfo( COMPONENT_DATA, DELDBE_DELIMITER_TOKEN, Chr(0) )

use WARE
append from (file) ALL via DELDBE
Zuletzt geändert von peternmb am Do, 11. Dez 2008 17:54, insgesamt 1-mal geändert.
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
ich mache das so:
select 1
use ware
select 2
DbeSetDefault( "DELDBE" )
DbeInfo( COMPONENT_DATA, DELDBE_DELIMITER_TOKEN, chr( 0 ) )
DbeInfo( COMPONENT_DATA, DELDBE_FIELD_TOKEN, ';' )
DbeInfo( COMPONENT_DATA, DELDBE_FIELD_TYPES, "CCNN )
use ( "test.csv" ) via ("DELDBE")
go top
skip // weil in der ersten Zeile die Spaltenbeschriftungen stehen...
do while .not. eof()
select 1
append blank
select 2
replace ware->ART_NR with field->field1
replace ware->ART_NAME with field->field2
replace ware->VK with field->field3
replace ware->EK with field->field4
...
Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

Hallo Martin,

ich bekomme eine Fehlermeldung bei der Zeile:

Code: Alles auswählen

DbeSetDefault( "DELDBE" )
Fehlermeldung: oError:description : Invalid DBE name

die Datei DelDbe.ch habe ich aber mit eingebunden

Code: Alles auswählen

#include "DelDbe.ch"
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
wie lautet der Fehler denn?
Hast Du die DelDbe.DLL im Pfad?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi Peter,

da ich meine Fehler kenne (nicht nur ich :lol: ) frage ich mal ganz doof, hast Du die DELDBE auch als Engine eingebunden?
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

ja, die Pfadangaben sind korrekt gesetzt

Code: Alles auswählen

Xbase++ version     : Xbase++ (R) Version 1.90.331
Operating system    : Windows XP 05.01 Build 02600 Service Pack 2
------------------------------------------------------------------------------
oError:args         :
          -> VALTYPE: C VALUE: DELDBE
oError:canDefault   : Y
oError:canRetry     : N
oError:canSubstitute: N
oError:cargo        : NIL
oError:description  : Invalid DBE name
oError:filename     : 
oError:genCode      :         61
oError:operation    : DbeSetDefault
oError:osCode       :          0
oError:severity     :          2
oError:subCode      :       8050
oError:subSystem    : BASE
oError:thread       :          1
oError:tries        :          0
------------------------------------------------------------------------------
CALLSTACK:
------------------------------------------------------------------------------
Called from ...
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
hast Du eine Dbesys()-Prozedur in Deinem Code?
Wenn ja, wie sieht die aus?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

die Datenbank-Engine ist eingebunden

Code: Alles auswählen

PROCEDURE dbeSys()
  /* Anpassung der Sortierfolge */
   SET COLLATION TO GERMAN
  /* DBF und NTX Database-Engine werden "hidden" geladen
   * und zu der neuen abstrakten DBFNTX Database-Engine verbunden */

   IF ! DbeLoad( "DELDBE", .T.)
      Alert( "Database-Engine DELDBE nicht geladen" , {"OK"} )
   ENDIF

   IF ! DbeLoad( "DBFDBE", .T.)
      Alert( "Database-Engine DBFDBE nicht geladen" , {"OK"} )
   ENDIF
   IF ! DbeLoad( "NTXDBE", .T.)
      Alert( "Database-Engine NTXDBE nicht geladen" , {"OK"} )
   ENDIF
   IF ! DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
      Alert( "DBFNTX Database-Engine;konnte nicht erzeugt werden" , {"OK"} )
   ENDIF
   DbeSetDefault( "DBFNTX" )
RETURN
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
wenn in Deiner DbeSys() das DbeSetDefault( "DBFNTX" ) klappt, weiß ich nicht, warum das DbeSetDefault( "DELDBE" ) nicht klappen soll...
Sehr merkwürdig!

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

Hallo Martin,

genau darüber habe ich mich auch schon seeehr gewundert :?
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Peter,
was passiert denn, wenn Du Deine komplette dbesys auskommentierst (also die Standard-DbeSys greift)?

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

Hi,

ich hatte den Fehler auch zu Anfang gehabt. Dann habe ich direkt nach dem Öffnen der Textdatei wieder auf die Standard DBE umgeschaltet. Sollte eigentlich egal sein, aber ich meine der Fehler wäre danach weg gewesen.
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

wenn ich in der dbeSys als default DELDBE angebe bekomme ich auch diese Fehlermeldung.

wenn ich die dbeSys weglasse, dann funktioniert alles - sehr seltsam :?

es ist zwar schön, dass es jetzt funktioniert, aber eine Erklärung dafür hätte ich schon ganz gerne
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Hallo Peter,
das liegt wohl daran, dass Du in Deiner DbeSys ein DbeLoad() für die DelDBE mit der Art Hidden gemacht hast - damit ist sie nicht direkt nutzbar!
Schau Dir mal dazu die Doku und die Standard-DbeSys() im Unterverzeichnis XPPW32\SOURCE\SYS an.

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
peternmb
1000 working lines a day
1000 working lines a day
Beiträge: 525
Registriert: Mi, 01. Feb 2006 16:22
Wohnort: 06618 Naumburg

Beitrag von peternmb »

ja, genau da hängt es.

Ich mußte in meiner DbeSys nur bei der Zeile

Code: Alles auswählen

IF ! DbeLoad( "DELDBE", .F.)
den Paramter auf .T. setzen und schon funktioniert es.

Da wäre ich mit Sicherheit ohne Unterstützung in 100 Jahren nicht draufgekommen - vielen Dank :)
Benutzeravatar
Manfred
Foren-Administrator
Foren-Administrator
Beiträge: 21200
Registriert: Di, 29. Nov 2005 16:58
Wohnort: Kreis Wesel
Hat sich bedankt: 210 Mal
Danksagung erhalten: 67 Mal

Beitrag von Manfred »

So ein Mist,

das ist mir auch passiert und ich hatte es vergessen......
Gruß Manfred
Mitglied der XUG Osnabrück
Schatzmeister des Deutschsprachige Xbase-Entwickler e.V.
großer Fan des Xbaseentwicklerwiki https://wiki.xbaseentwickler.de/index.p ... Hauptseite
Doof kann man sein, man muß sich nur zu helfen wissen!!
Benutzeravatar
Martin Altmann
Foren-Administrator
Foren-Administrator
Beiträge: 16517
Registriert: Fr, 23. Sep 2005 4:58
Wohnort: Berlin
Hat sich bedankt: 111 Mal
Danksagung erhalten: 48 Mal
Kontaktdaten:

Beitrag von Martin Altmann »

Tja,
und ich wußte es nicht und bin nur durch Anschauen der Original-DbeSys() drüber gestolpert...
Haben wir also alle mal wieder was von gelernt :D

Viele Grüße,
Martin
:grommit:
Webseite mit XB2.NET und ausschließlich statischem Content in Form von HTML-Dateien: https://www.altem.de/
Webseite mit XB2.NET und ausschließlich dynamischem Content in Form von in-memory-HTML: https://meldungen.altem.de/

Mitglied der XUG Osnabrück
Vorsitzender des Deutschsprachige Xbase-Entwickler e. V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: CSV-Datei in DBF einlesen

Beitrag von brandelh »

peternmb hat geschrieben:

Code: Alles auswählen

// Umlaute korrigieren
datei := MemoRead(file)
datei:=strTran(datei,chr(196),chr(142))   // Ä
datei:=strTran(datei,chr(228),chr(132))   // ä
datei:=strTran(datei,chr(214),chr(153))   // Ö
datei:=strTran(datei,chr(246),chr(148))   // ö
datei:=strTran(datei,chr(220),chr(154))   // Ü
datei:=strTran(datei,chr(252),chr(129))   // ü
datei:=strTran(datei,chr(223),chr(225))   // ß
memowrit( file,datei )
Hi,

mit ConvToAnsiCP() oder ConvToOemCP() je nach Grundlage geht es einfacher und genauer ;-)

... ich gehe jetzt mal davon aus, ohne Tabelle, dass das der Zweck ist :?
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Hubert,

einfacher ja, aber genauer ?
Interessant wäre es, die Ausführungsgeschwindigkeit zu vergleichen.

Ich nutze auch:

cWin := STRTRAN( cWin,CHR(196),CHR(142) ) // Ž
cWin := STRTRAN( cWin,CHR(228),CHR(132) ) // „
cWin := STRTRAN( cWin,CHR(214),CHR(153) ) // ™
cWin := STRTRAN( cWin,CHR(246),CHR(148) ) // ”
cWin := STRTRAN( cWin,CHR(220),CHR(154) ) // š
cWin := STRTRAN( cWin,CHR(252),CHR(129) ) //
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15697
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 66 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Koverhage hat geschrieben:einfacher ja, aber genauer ?
Hi,

Die Konvertierung von ANSI zu OEM ist eine Windows-API Funktion.
Ich weiß nicht, welche Zeichen jetzt in jedem Zeichensatz getauscht werden müssen, die Windows-API Funktion weiß es.
Conv* von Xbase++ ruft diese Funktion auf.

Da StrTran() extrem schnell ist, dürfte kaum ein Unterschied auf aktuellen Rechnern zu messen sein, aber ein Aufruf der Windows-API ist bestimmt schneller als x-Aufrufe von StrTran() - wer probiert es aus ;-)

Ob aber das EURO Zeichen auch von den Conv* Funktionen transferiert wird, weiß ich jetzt nicht.
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

eigentlich doch immer der fragt ;-)
Antworten