Seite 1 von 3
Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 4:46
von Eugeny Lutsenko
Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Zum Beispiel Datei: train_V2.csv aus dieser Quelle:
https://www.kaggle.com/c/pubg-finish-pl ... ction/data
Was ist der Quellcode des Programms, das Sie schnell tun können?
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 8:14
von AUGE_OHR
hi,
unter 32 Bit wird es wohl nicht in "eine" DBF passen ...
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 9:33
von ramses
Jimmy
das ist so nicht richtig. Ohne Anpassung ist die DBF Grösse 1GB. (Clipper-Kompatibel)
Wird der Lockoffset höher gestellt passen ca. 2.4 GB in eine DBF.
Die Datei von Eugeny ist ca. 650MB gross, die passt sicher auch unter 32 Bit in eine DBF.
Siehe DOC von Alaska
DBFDBE_LOCKOFFSET
This constant returns or changes the offset for record locks. The offset for record locks determines the maximum size of the DBF table. The default offset for record locks is 1.000.000.000 or approx. 1GB. This corresponds to the maximum size of a Clipper-compatible DBF table.
To increase the storage capacity of DBF files to the current maximum of ~2.4GB, a locking offset of 0x80000000 must be configured. Changing the DBFDBE_LOCKOFFSET allows to extend the maximum file capacity of DBF tables beyond Clipper's capacity. However these DBF tables cannot be shared safely with Clipper due to the different locking offsets used to syncronize concurrent operations. The maximum value for DBFDBE_LOCKOFFSET is 0xFFFFFFFF.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 9:38
von brandelh
4 Millionen Zeilen allein sind noch kein Problem, aber Zeilen * Anzahl Zeichen je Zeile + Header müssen unter der maximalen Dateigröße einer DBF bleiben:
2,4 GB (Lock offset richtig setzen !)
Der Sperroffset kann maximal dem Wert einer LONG entsprechen (&H7FFFFFFF), int -2147483648..2147483647 32 Bit
2147483647 / 4000000 Millionen Datensätze => etwa 500 Zeichen je Zeile sollten möglich sein, eventuell Textfelder ab 20 mit FOXDBE in eine Memodatei (FTP) auslagern.
Das Einlesen von Textdateien jeder Art kann mit meiner Funktion so schnell wie möglich erledigt werden:
viewtopic.php?f=16&t=7961
dennoch sollte man sich bei großen Datenbeständen immer überlegen, ob man nicht besser einen SQL Server nutzt.
EDIT: ramses war schneller
Aber Alaskas Text ist nicht ganz richtig.
Bei Clipper gab es da eine OBJ die man einsetzen konnte um auch auf die 2,4 GB zu kommen.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 10:45
von Koverhage
Die Größe ist ja nur ein Kriterium. Die Frage die sich mir stellt, kann eine DBF 4 Millionen Sätze enthalten ?
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 10:59
von brandelh
Klaus probiere es aus
Die Satznummer wird ja nicht in der Datenzeile gespeichert, somit ist diese nur von der 2 Milliardengrenze (max LONG) begrenzt.
Ich hatte mal ein Testprogramm, das eine DBF mit einem numerischen Feld (15 Stellen) auf 113 Millionen Sätze gefüllt hat. Ob das Sinn macht ist eine andere Frage.
Eine Excel XLSX Datei kann max. 1 Million Datenzeilen enthalten.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 11:21
von brandelh
Hier mal der Quellcode zum Testprogramm, falls es jemand testen will.
Code: Alles auswählen
#include "XBP.CH"
#include "DMLB.CH"
#include "DBFDBE.CH"
#include "ntxdbe.ch"
#include "Error.ch"
PROCEDURE DbeSys()
IF !DbeLoad( "DBFDBE", .T. )
ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
ENDIF
IF !DbeLoad( "NTXDBE", .T. )
ALERT( MSG_DBFDBE_NOT_LOADED, { "OK" } )
ENDIF
IF !DbeBuild( "DBFNTX", "DBFDBE", "NTXDBE" )
ALERT( MSG_DBFNTX_NOT_CREATED, { "OK" } )
ENDIF
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeSetDefault( "DBFNTX" )
RETURN
PROCEDURE Main
local cDBF, nWahl
set exclusive on
set alternate to test.txt additive
set alternate on
cls
@ 1,1 say " 1=7F, 2=8F, 3=FF, 4=FFv, 5=80 "
nWahl := 2
@ 2,1 get nWahl
read
do case
case nWahl = 1
cDBF := "Test_7F_exlusive.DBF"
? "Datei mit 0x7FFFFFFF - wo ich nur diesen Wert her habe ? ",0x7FFFFFFF
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x7FFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x7FFFFFFF )
case nWahl = 2
cDBF := "Test_8F_exlusive.DBF"
? "Datei mit 0x8FFFFFFF - Empfehlung von Alaska ? ",0x8FFFFFFF
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x8FFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x8FFFFFFF )
case nWahl = 3
cDBF := "Test_FF_exlusive.DBF"
? "Datei mit 0xFFFFFFFF - mehr geht nicht",0xFFFFFFFF
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
case nWahl = 4
cDBF := "Test_FF_voreingestellt.DBF"
? "Datei mit 0xFFFFFFFF - in DbeSys() eingestellt",0xFFFFFFFF
case nWahl = 5
cDBF := "Test_80_exlusive.DBF"
? "Datei mit 0x80000000 ",0x80000000
DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0x80000000 )
DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0x80000000 )
end
dbcreate( cDBF ,{{"SATZNR","N",18,0}} )
use (cDBF)
cls
@ 1,1 say cDBF
@ 2,1 say "Recno()"
do while .t.
append blank
replace SATZNR with recno()
if int(recno()/1000) = recno()/1000
@ 2,15 say recno() picture "999,999,999,999"
endif
enddo
inkey(10)
RETURN
/*
? "Datei mit 0xFFFFFFFF"
* DbeInfo( COMPONENT_DATA, DBFDBE_LOCKOFFSET, 0xFFFFFFFF )
* DbeInfo( COMPONENT_ORDER, NTXDBE_LOCKOFFSET, 0xFFFFFFFF )
*/
*--------------------------------------------------------------------------------
FUNCTION IsRecNoOutOfDBF(nRecNo,nMaxByte) // nMaxByte muss mit der Dateil„nge per fSize() belegt sein !
local IsEOF, nRecNoByte := (RecSize() * nRecNo ) + Header() + 1
IsEOF := ( nRecNoByte > nMaxByte )
RETURN IsEOF
*--------------------------------------------------------------------------------
FUNCTION DbfFileSize()
RETURN ( (RecSize() * LastRec()) + Header() + 1 )
*--------------------------------------------------------------------------------
Function BeschreibeFehler(oError)
? " - oError:args ", oError:args
? " - oError:description ", oError:description
? " - oError:genCode ", oError:genCode
? " - oError:subCode ", oError:subCode
? " - oError:subSystem ", oError:subSystem
? " - oError:OsCode ", oError:OsCode, " => ",DosErrorMessage(oError:OsCode)
return nil
*--------------------------------------------------------------------------------
Function ntrim(nWert)
return alltrim(str(nWert))
*--------------------------------------------------------------------------------
Function CopyRecord(nQuelle, nZiel)
local nFeldMax, nFeld, uWert, bSaveError, oError
bSaveError := ErrorBlock()
if (nQuelle)->(eof())
return .f.
endif
ErrorBlock( {|e| Break(e)} )
BEGIN SEQUENCE
(nZiel)->(dbAppend())
if neterr()
? "NetErr() meldet Fehler bei AuPos"
inkey(10)
quit
endif
RECOVER USING oError
ErrorBlock( bSaveError )
? "Fehler bei DBAppend(), APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt ignorieren"
BeschreibeFehler(oError)
? "Programm beendet nach Append-Fehler"
quit
END SEQUENCE
nFeldMax := (nQuelle)->(fcount())
for nFeld := 1 to nFeldMax
ErrorBlock( {|e| Break(e)} )
BEGIN SEQUENCE
uWert := (nQuelle)->(fieldGet(nFeld))
RECOVER USING oError
ErrorBlock( bSaveError )
uWert := NIL
? "Fehler beim Lesen, APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt ignorieren"
BeschreibeFehler(oError)
END SEQUENCE
if uWert <> NIL
BEGIN SEQUENCE
(nZiel)->(fieldPut(nFeld, uWert ))
RECOVER USING oError
ErrorBlock( bSaveError )
? "Fehler beim Schreiben, APAUFNR=",(nQuelle)->APAUFNR,", Feld ",nFeld,(nQuelle)->(fieldname(nFeld))," Feldinhalt: ",uWert,"Typ:",valtype(uWert)
BeschreibeFehler(oError)
END SEQUENCE
endif
next
ErrorBlock( bSaveError )
return .t.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 11:51
von Rolf Ramacher
m.e. ist hierbei eine Forxpro dbf besser geeignet. xbase bietet ja einen foxpro-treiber . aber 4 Millionen hatte ich auch noch nicht
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 12:11
von Jan
Ich habe laufende FOXCDX mit 2,5 Mio. Sätzen. Und eine, das war früher mal eine DBFNTX und wurde so wie sie war nur nach FOXCDX konvertiert, keine Daten mehr hinzugefügt, die hat aber auch 2,1 Mio. Sätze.
Jan
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 12:56
von HaPe
Hallo Zusammen !
Ich habe laufende FOXCDX mit 2,5 Mio. Sätzen.
Ich habe eine Messdaten-DBF mit 35 Mio. Sätzen
Das geht schon ...
Die Daten werden jedes Jahr in eine Jahres-Tabelle ausgelagert wegen 2 GB Größe.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 13:13
von Jan
Hallo Hans-Peter,
ja, die Größe ... Die größte dbf mit der ich je gearbeitet habe ist 6,1 GB groß. Und hat 99.842.748 Sätze. Das wurde dann aber auch wirklich sehr hakelig und langsam. Daher habe ich die dann jahreweise aufgesplittet. Resultat ist u. a. die oben aufgeführte dbf. Wo ich mich aber in den Tausendertrennungen vertan hab (man sollte Zahlen zählen können ...). Die hat 25 Mio. Sätze, nicht 2,5 Mio.
Wobei ich noch eine dbf mit 2,7 GB und (aktuelle Momentaufnahme) 2.172.914 Sätzen im Dauergebrauch habe. Zwei weitere sind mit 2,4 (2.110.174 Sätze) und 2,1 GB (1.689.606 Sätze) ebenfalls größer als 2 GB. Alles andere ist dann darunter.
Jan
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 14:20
von brandelh
Hallo Ihr beiden ...
kann es sein, dass die DBFs die über 2 GB groß sind mit der ADS verwaltet werden ?
Ich habe es nie geschafft, eine über 2 GB große DBF zu erstellen, wenn keine ADS würden mich die DBESYS Einstellungen interessieren.
PS: Natürlich kann unter NTFS jede Datei sehr viel größer werden als 2 GB (je nach System im Terrabyte Bereich), mir ist es mit der DBFDBE / FOXDBE nur nicht gelungen.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 14:29
von Jan
Hubert,
ja, bei mir FOXCDX mit ADS 12.
Wobei das ja von der Dateigröße selber egal sein müsste. Denn die existiert bei FOXCDX ja trotzdem als eigenständige Datei. Nur ob der Zugriff noch sauber klappt kann vom ADS beeinflußt sein.
Jan
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 15:26
von HaPe
Hallo Hubert !
kann es sein, dass die DBFs die über 2 GB groß sind mit der ADS verwaltet werden ?
Nein und nein.
Die VFP-Tabellen sind maximal 2 GB groß; und den ADS kenne ich nur vom HörenSagen
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 17:26
von AUGE_OHR
hi,
anscheinend hat Eugene den Text geändert
"How to enter a very large csv file (more than 400 million rows) into the database?".
DAS passt wohl kaum in eine DBF von einer 32 Bit App.
---
es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten
https://groups.google.com/forum/#!topic ... Fc6qLTERi8
Code: Alles auswählen
#include "dbinfo.ch"
...
set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_HB64 )
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 18:45
von Eugeny Lutsenko
brandelh hat geschrieben: ↑Fr, 16. Okt 2020 9:38
4 Millionen Zeilen allein sind noch kein Problem, aber Zeilen * Anzahl Zeichen je Zeile + Header müssen unter der maximalen Dateigröße einer DBF bleiben:
2,4 GB (Lock offset richtig setzen !)
Der Sperroffset kann maximal dem Wert einer LONG entsprechen (&H7FFFFFFF), int -2147483648..2147483647 32 Bit
2147483647 / 4000000 Millionen Datensätze => etwa 500 Zeichen je Zeile sollten möglich sein, eventuell Textfelder ab 20 mit FOXDBE in eine Memodatei (FTP) auslagern.
Das Einlesen von Textdateien jeder Art kann mit meiner Funktion so schnell wie möglich erledigt werden:
viewtopic.php?f=16&t=7961
dennoch sollte man sich bei großen Datenbeständen immer überlegen, ob man nicht besser einen SQL Server nutzt.
EDIT: ramses war schneller
Aber Alaskas Text ist nicht ganz richtig.
Bei Clipper gab es da eine OBJ die man einsetzen konnte um auch auf die 2,4 GB zu kommen.
Hallo, Brandelh! Ich habe mir Ihren Testfall über einen Link zu einem anderen Thema (ähnlich diesem) angesehen. Ihr Beispiel von mir kompiliert und funktioniert sehr gut. Aber für mich ist es ein Problem, Ihr Beispiel so zu modifizieren, dass die Daten aus der csv-Datei in die dbf-Datei übertragen werden. auch wenn alle Felder textbasiert sind. Ich werde dann analysieren diese Datei selbst bestimmen die erforderlichen Feldgrößen und Datentypen und übertragen alles in eine dbf-Datei mit der gewünschten Struktur
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 19:07
von Eugeny Lutsenko
AUGE_OHR hat geschrieben: ↑Fr, 16. Okt 2020 17:26
hi,
anscheinend hat Eugene den Text geändert
"How to enter a very large csv file (more than 400 million rows) into the database?".
DAS passt wohl kaum in eine DBF von einer 32 Bit App.
---
es ist aber unter 64 Bit möglich bis 2^41 -> 2 TeraByte zu arbeiten
https://groups.google.com/forum/#!topic ... Fc6qLTERi8
Code: Alles auswählen
#include "dbinfo.ch"
...
set( _SET_DBFLOCKSCHEME, DB_DBFLOCK_HB64 )
Hey, Jimmy! Du hast Recht. Es ist meine Hand zitterte von den großen zahlen und es stellte sich heraus, dass eine zusätzliche null.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 19:25
von brandelh
Jan hat geschrieben: ↑Fr, 16. Okt 2020 14:29
Hubert,
ja, bei mir FOXCDX mit ADS 12.
Wobei das ja von der Dateigröße selber egal sein müsste. Denn die existiert bei FOXCDX ja trotzdem als eigenständige Datei. Nur ob der Zugriff noch sauber klappt kann vom ADS beeinflußt sein.
Jan
Der ADS nutzt mit Xbase++ inkompatible Sperrmechanismen und umgeht so das Problem mit dem Lock-Offset.
Außerdem können Sie intern natürlich auch die 64 Bit Zahlen nutzen, was die Alaska FOX / DBF Treiber nicht machen, da diese ja kompatibel sein müssen.
Bei allen meinen Tests war es mit 2,1 GB Schluss mit Fehlermeldung. Auch bei exklusivem Zugriff.
HaPe hat geschrieben:Die VFP-Tabellen sind maximal 2 GB groß;
sorry das hatte ich überlesen.
@ Jimmy,
nachträglich die Zahl geändert ? Das erklärt einiges
es ist sicherlich ein Unterschied zwischen 400 / 40 und 4 Millionen Datenzeilen.
Wenn dann hauptsächlich Textfelder verwendet werden die womöglich auch noch länger sind, dann ist da ganz schnell Feierabend.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 19:28
von Jan
Die Hilfe sagt zu FOXDBE:
Table file size Limited to 2^31 bytes (2 gigabytes)
Max. number of fields 2038 *)
Max. number of records (2^31 - Header() - 1) / RecSize()
*) Xbase++ versions ealier than 1.90 support only 255 fields per table
Jan
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 19:29
von brandelh
Und wo widerspricht das meiner Aussage ?
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Fr, 16. Okt 2020 22:43
von AUGE_OHR
hi,
Eugeny Lutsenko hat geschrieben: ↑Fr, 16. Okt 2020 18:45
Aber für mich ist es ein Problem, Ihr Beispiel so zu modifizieren, dass die Daten aus der csv-Datei in die dbf-Datei übertragen werden. auch wenn alle Felder textbasiert sind. Ich werde dann analysieren diese Datei selbst bestimmen die erforderlichen Feldgrößen und Datentypen und übertragen alles in eine dbf-Datei mit der gewünschten Struktur
Express++ hat
wenn man die Dateien im Array hat kann man die maximale Länge suchen
i use this Code when Read a Excel Sheet to create a "optimzize" DBF
Code: Alles auswählen
FUNCTION FindMax( aNew, nRowStart, nRowEnd, nCol )
LOCAL aSeek := ACLONE( aNew ) // use ACLONE() !
LOCAL nMax, nLen := 0
LOCAL bSaveError, i
bSaveError := ERRORBLOCK() // save Errorblock
ERRORBLOCK( { | e | BREAK( e ) } ) // set new Errorblock
BEGIN SEQUENCE
// reduce to 1-Dim
//
AEVAL( aSeek, { | a, i | aSeek[ i ] := aSeek[ i ] [ nCol ] }, nRowStart )
// delete Row before nRowStart
//
FOR i := 1 TO nRowStart - 1
ADEL( aSeek, 1 )
ASIZE( aSeek, LEN( aSeek ) - 1 )
NEXT
// be sure to have String
//
AEVAL( aSeek, { | a, i | aSeek[ i ] := ALLTRIM( VAR2CHAR( aSeek[ i ] ) ) } )
// just sort to find Max
//
ASORT( aSeek,, ( nRowEnd - nRowStart + 1 ), { | c1, c2 | LEN( c1 ) > LEN( c2 ) } )
RECOVER
END SEQUENCE
ERRORBLOCK( bSaveError ) // restore Errorblock
// it is 1st Element
//
nLen := LEN( TRIM( aSeek[ 1 ] ) )
aSeek := NIL
RETURN nLen
! Note : as i use ACLONE() it need dupe Size of RAM so it work only up to 1 GB under 32 Bit Apps
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Sa, 17. Okt 2020 10:38
von brandelh
Ein Array schließt sich bei der Dateigröße automatisch aus.
Automatisch geht erstmal gar nichts.
Man muss tatsächlich z.B. mit meiner Klasse zuerst den ersten Satz einlesen, dort die Überschriften analysieren (ist Name gültig, will ich die Spalte, etc.).
Danach liest man die ganze Datei durch und sucht die maximale Länge jedes Feldes (Blanks am Ende eventuell kürzen).
Aus dieser Info kann man dann eine passende DBF und die Import-Routine bauen, eventuelle Plausis, Grundwerte, Konvertierungen müssen ebenso beachtet werden.
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Sa, 17. Okt 2020 11:06
von Eugeny Lutsenko
brandelh !
Das habe ich mir so vorgestellt. Aber ich weiß nicht, wo in Ihrem Beispiel Daten aus einer csv-Datei gelesen werden sollen, um Sie in dbf einzufügen
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Sa, 17. Okt 2020 14:14
von brandelh
ach der Quellcode oben ... der ist gedacht um DBF mit verschiedenen Größen zu erstellen.
Was ich meinte ist in der Wissensbasis
viewtopic.php?f=16&t=7961
dort die
HBTextReader.ZIP laden, in der HBTextReader.PRG gibt es oben ein Beispiel und unten ist die Klasse ...
hier ist ein Beispiel aus dem Quellcode:
Code: Alles auswählen
nZeile := 0
oTR := HBTextReader( cFile ) // per Funktion
if oTR:FError() <> 0
@ 5,1 say "Fehler beim Datei öffnen: "+oTR:ErrMsg()
inkey(30)
quit
endif
nSize := oTR:FSize()
@ 1,1 say "Testdatei sequentiell einlesen, Dateityp: "+oTR:FileType()
@ 3,1 say "DateigrӇe "+transform(nSize,"###,###,###,###,###")
nDauer := seconds()
do while ! oTR:EOF()
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n„chste Zeile setzen !
nZeile++ // oder oTR:RecNo() // beides m”glich !
nBytes += len(cZeile)+iif(oTR:IsCrLf(),2,1) // CR+LF = 2 Byte
// CSV Dateien mit ";" Trenner k”nnen zeilenweise ganz einfach in ein Array aufgeteilt werden:
//
// aZeile := Tokenize(cZeile, ";" ) // ot4xb.dll einbinden !
if nZeile % 1000 = 0 // je nach Anzahl alle 100 oder 1000 S„tze aufrufen
@ 5,1 say "gelesene Bytes "+transform(nBytes, "###,###,###,###,###")
@ 6,1 say "gelesene Zeilen "+transform(nZeile, "###,###,###,###,###")
@ 7,1 say "interne Zeilennr. "+transform(oTR:RecNo(),"###,###,###,###,###")
@ 8,1 say "Datenzeile: "+left(cZeile,20)
endif
enddo
oTR:Destroy()
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Verfasst: Sa, 17. Okt 2020 15:30
von georg
Hallo, Eugeny -
was ist Deine eigentliche Frage?
Es gibt da verschiedene Aspekte, beginnend mit der Dateigrösse, sich am Ende existiert. Das wurde hier ausreichend besprochen.
Oder geht es um das Einlesen der Datei? Das geht via DELDBE/SDFDBE oder fOpen(), fRead(), fClose() (oder viele andere Varianten).
Oder geht es um die Geschwindigkeit, wie man es am schnellsten gespeichert bekommt?
Leider kann ich die Datei nicht herunterladen, ohne mich zu registrieren, daher fehlen mir Informationen über den Aufbau (sind alle Datensätze gleich lang?).