Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Moderator: Moderatoren
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Hallo, georg! Danke für deine Aufmerksamkeit. Ich kenne das alles und benutze es seit langem und erfolgreich. Aber wenn die Datei sehr groß ist, arbeiten die traditionellen Tools der Arbeit mit csv-Dateien sehr langsam. In den Speicher werden solche Dateien überhaupt nicht geladen. Deshalb habe ich diese Frage aufgeworfen. Aber ich Stimme dir im Allgemeinen zu. Ich habe keine Fragen. Dank brandelh habe ich genug Informationen bekommen, um alles selbst zu verstehen.
PS
Schau dir mein Programm an: http://lc.kubagro.ru/__AIDOS-X.txt
PS
Schau dir mein Programm an: http://lc.kubagro.ru/__AIDOS-X.txt
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
What is the fastest way to find out whether a number is in a text variable or not. In addition to numbers, a variable with a number can contain a plus, minus, or period. This number can also be zero.
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Ich denke es gibt keine einfache Lösung, je nach Form der Zahl in der Variablen bleibt nur der Test auf erlaubte Zeichen je Stelle.
Das sicherste ist immer noch die Dateibeschreibung anzusehen und danach zu handeln.
Das sicherste ist immer noch die Dateibeschreibung anzusehen und danach zu handeln.
Gruß
Hubert
Hubert
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Hallo, brandelh!
Ich habe lange darüber nachgedacht und getan, wie Sie sagen. Ich suchte nach einer Funktion vom Typ IsNumber(), aber es war nicht da. Ich musste die Symbole überprüfen. Alles funktioniert, aber leider nicht so schnell, wie wir möchten. Aber es funktioniert mit dieser sehr großen CSV-Datei mit 4 Millionen Zeilen. Das Ergebnis war eine dbf-Datei mit einer Größe von 716 MB. Der Quellcode des Laufenden Programms mit dem ausführbaren Modul und ein Beispiel beigefügt. Aber ich werde es weiter verbessern. Vielen Dank an Brandel für die konkrete und echte Hilfe!
PS
By the way, brandelh, in der Regel eine wunderbar funktionierende Funktion Tokenize() gibt einen Ausführungsfehler bei der csv-Datei 4 Millionen Zeilen. Also musste ich TOKEN() verwenden
Ich habe lange darüber nachgedacht und getan, wie Sie sagen. Ich suchte nach einer Funktion vom Typ IsNumber(), aber es war nicht da. Ich musste die Symbole überprüfen. Alles funktioniert, aber leider nicht so schnell, wie wir möchten. Aber es funktioniert mit dieser sehr großen CSV-Datei mit 4 Millionen Zeilen. Das Ergebnis war eine dbf-Datei mit einer Größe von 716 MB. Der Quellcode des Laufenden Programms mit dem ausführbaren Modul und ein Beispiel beigefügt. Aber ich werde es weiter verbessern. Vielen Dank an Brandel für die konkrete und echte Hilfe!
PS
By the way, brandelh, in der Regel eine wunderbar funktionierende Funktion Tokenize() gibt einen Ausführungsfehler bei der csv-Datei 4 Millionen Zeilen. Also musste ich TOKEN() verwenden
- Dateianhänge
-
- 1.zip
- (56.48 KiB) 229-mal heruntergeladen
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Hallo Eugeny
Ich verwende die Funktion regelmässig um Dateien grösser als 10 GB einzulesen das funktioniert immer einwandfrei.
Die grösste Datei dich ich in DBF Dateien einlese hatte heute z.B. 105Mio. Einträge die liess sich problemlos in eine DBF einlesen.
Die noch grösseren Datei die ich mit den HB Funktionen einlesen schreibe ich in eine PostgreSQL Datenbank.
Eine Datei die ich regelmässig einlese hat ca. 450Mio. Datensätze das läuft immer problemlos durch.
Kann es sein dass deine Datei nicht über die ganze Länge korrekt formatiert ist?
Das kann nicht sein.Eugeny Lutsenko hat geschrieben: ↑Mo, 19. Okt 2020 6:36 By the way, brandelh, in der Regel eine wunderbar funktionierende Funktion Tokenize() gibt einen Ausführungsfehler bei der csv-Datei 4 Millionen Zeilen. Also musste ich TOKEN() verwenden
Ich verwende die Funktion regelmässig um Dateien grösser als 10 GB einzulesen das funktioniert immer einwandfrei.
Die grösste Datei dich ich in DBF Dateien einlese hatte heute z.B. 105Mio. Einträge die liess sich problemlos in eine DBF einlesen.
Die noch grösseren Datei die ich mit den HB Funktionen einlesen schreibe ich in eine PostgreSQL Datenbank.
Eine Datei die ich regelmässig einlese hat ca. 450Mio. Datensätze das läuft immer problemlos durch.
Kann es sein dass deine Datei nicht über die ganze Länge korrekt formatiert ist?
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Vielleicht habe ich es nicht herausgefunden... In meinem Programm kann man sehen, wo ich diese Funktion auskommentiert habe. Wie kann ich die Anzahl der Datensätze in einer csv-Datei schnell herausfinden?
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Etwas schnelles gibt es vermutlich nicht.Eugeny Lutsenko hat geschrieben: ↑Mo, 19. Okt 2020 12:29 Wie kann ich die Anzahl der Datensätze in einer csv-Datei schnell herausfinden?
Das einzige was mir für grosse Dateien einfällt ist die Datei abarbeiten und dabei die CRLF zu zählen.
Valar Morghulis
Gruss Carlo
Gruss Carlo
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Stimmt, ich habe eine Funktion, die ein Datei in eine Variable liest und mit StrTran() CRLF gegen "" tauscht, der Längenunterschied gibt dann schnell die Anzahl zurück, aber bei mehr als 200 MB ist da Feierabend.
Gruß
Hubert
Hubert
-
- Rekursionen-Architekt
- Beiträge: 151
- Registriert: Di, 11. Mai 2010 16:27
- Hat sich bedankt: 3 Mal
- Danksagung erhalten: 9 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Schnell ist relativ aber für das Einlesen von ASCII-Monsterdateien
ohne selbstgebautes Durchlaufen ist der Editor PilotEdit-Lite absolut praktikabel.
Zum Downloaden die kostenfreie Lite-Version auf www.pilotedit.com
Damit könnte Eugeny die Zeilenanzahl einfach eruieren
ohne selbstgebautes Durchlaufen ist der Editor PilotEdit-Lite absolut praktikabel.
Zum Downloaden die kostenfreie Lite-Version auf www.pilotedit.com
Damit könnte Eugeny die Zeilenanzahl einfach eruieren
Ahoile aus dem Süden
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
der Link ist interessant, mein MED geht bei 300 MB aufwärts in die Knie ...
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12912
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi,
es ist wieder mal der Fall wo es bei einer 64 Bit App kein Problem wäre.
da kann ich mit MemoRead() / Memoline() / MlCount() Dateinen > 64 KB up-to 2 TB bearbeiten.
es ist wieder mal der Fall wo es bei einer 64 Bit App kein Problem wäre.
da kann ich mit MemoRead() / Memoline() / MlCount() Dateinen > 64 KB up-to 2 TB bearbeiten.
gruss by OHR
Jimmy
Jimmy
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Ich denke, mein Niveau als Programmierer ist nicht das, was ich mir gewünscht hätte...ramses hat geschrieben: ↑Mo, 19. Okt 2020 11:40 Hallo Eugeny
Das kann nicht sein.Eugeny Lutsenko hat geschrieben: ↑Mo, 19. Okt 2020 6:36 By the way, brandelh, in der Regel eine wunderbar funktionierende Funktion Tokenize() gibt einen Ausführungsfehler bei der csv-Datei 4 Millionen Zeilen. Also musste ich TOKEN() verwenden
Ich verwende die Funktion regelmässig um Dateien grösser als 10 GB einzulesen das funktioniert immer einwandfrei.
Die grösste Datei dich ich in DBF Dateien einlese hatte heute z.B. 105Mio. Einträge die liess sich problemlos in eine DBF einlesen.
-
- Der Entwickler von "Deep Thought"
- Beiträge: 2518
- Registriert: Mi, 28. Jul 2010 17:16
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 77 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Hallo Eugeny
Du verwendest Tokenize() aus den ot4xb Tools. Diese Funktion gibt dir ein Array mit den gefundenen Token zurück.
Es kann auch ein leeres Array sein wenn kein Token gefunden wurde.
Das heisst wenn du:
verwendest MUSST du in deiner For Next Schleife
auch unbedingt prüfen dass dein Array aus Tokenize() auch wirklich soviele Token wie angefordert enthält.
Enthält eine Datenzeile weniger Token ist das Array zu kurz und beim Zugriff auf ein nicht vorhandenenes Token = Array Element bekommst du einen Laufzeitfehler. Das ist dein Problem. Denn bei deiner Lösung mit
kann dies nicht vorkommen weil du sichergestellt hast dass das Array IMMER die korrekte Länge hat. Fehlende Token sind einfach leer.
Nein das denke ich nicht.Eugeny Lutsenko hat geschrieben: ↑Mo, 19. Okt 2020 18:53 Ich denke, mein Niveau als Programmierer ist nicht das, was ich mir gewünscht hätte...
Du verwendest Tokenize() aus den ot4xb Tools. Diese Funktion gibt dir ein Array mit den gefundenen Token zurück.
Es kann auch ein leeres Array sein wenn kein Token gefunden wurde.
Das heisst wenn du:
Code: Alles auswählen
aZeile := Tokenize(cZeile, "," )
Code: Alles auswählen
FOR j=1 TO nField
Enthält eine Datenzeile weniger Token ist das Array zu kurz und beim Zugriff auf ein nicht vorhandenenes Token = Array Element bekommst du einen Laufzeitfehler. Das ist dein Problem. Denn bei deiner Lösung mit
Code: Alles auswählen
FOR j=1 TO nField
aFieldVal[j] = ALLTRIM(TOKEN(cZeile, ',', j))
NEXT
Valar Morghulis
Gruss Carlo
Gruss Carlo
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Es scheint, dass alles hauptsächlich mit der Vorhersage der Ausführungszeit und der Anzeige des ausführungsprozesses gemacht wurde. Aber es bleibt ein Strich, den ich nicht verstehe, warum es nicht funktioniert. Aus irgendeinem Grund wird der Prozess am Ende nach der Ausführung nicht angehalten, sondern weiter fortgesetzt. Niemand wird mir sagen, warum? In Anderen Fällen funktioniert diese Lösung gut.
Code: Alles auswählen
******************************************************************************************
******** Преобразование файла: Inp_data.csv в Inp_data.dbf. Проверено на 4 млн. записей
******************************************************************************************
FUNCTION CsvDbfConv()
local nZeile := 0
local cZeile := ""
local nSize, nBytes := 0
local nDauer, cFile, oTR
************************************************************************************************************************************
******* Определение имен, типов и длин полей, а для числовых полей и числа знаков после запятой, для создания Inp_data.dbf *********
************************************************************************************************************************************
DIRCHANGE(Disk_dir+'\AID_DATA\Inp_data\') // Перейти в папку: ..\AID_DATA\Inp_data\
cFile := "Inp_data.csv"
IF .NOT. FILE(cFile)
LB_Warning(L('В папке:')+' '+Disk_dir+'\AID_DATA\Inp_data\'+' '+L('должен быть файл:')+' '+'"Inp_data.csv"', L('(C) Система "Эйдос"'))
RETURN NIL
ENDIF
oTR := HBTextReader( cFile ) // per Funktion
* oTR := HBTxtReader():new( cFile ) // oder Klassentypisch !
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n"chste Zeile setzen !
* aFieldName = Tokenize(cZeile, "," )
oTR:Destroy()
aFieldName := {}
FOR j=1 TO NUMTOKEN(cZeile, ',')
AADD(aFieldName, ALLTRIM(TOKEN(cZeile, ',', j)))
NEXT
nField := LEN(aFieldName)
**** Создание и запись файла наим.класс.и опис.шкал и градаций: "Inp_name.txt" для API 2.3.2.2 *********
CrLf = CHR(13)+CHR(10) // Конец строки (записи)
String = aFieldName[2] + CrLf // Наименования объектов не включаем, т.к. это не шкала. Все остальные колонки со 3-й по последнюю включаем
IF nField > 2
FOR j=3 TO nField
String = String + aFieldName[j] + IF(j<nField,CrLf,"")
NEXT
ENDIF
StrFile(String, "Inp_name.txt") // Запись текстового файла "Inp_name.txt"
PRIVATE aFieldType[nField];AFILL(aFieldType, 'N')
PRIVATE aFieldDeci[nField];AFILL(aFieldDeci, 0 )
PRIVATE aFieldSize[nField];AFILL(aFieldSize, 0 )
PRIVATE aFieldVal [nField]
oScr := DC_WaitOn(L('Определение числа записей в файле "Inp_data.csv" (для прогнозирования и индикации времени исполнения'),,,,,,,,,,,.F.)
N_ALL := 0 // Всего строк в CSV-файле
oTR := HBTextReader( cFile )
nDauer := seconds()
do while ! oTR:EOF()
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n"chste Zeile setzen !
N_ALL++
enddo
oTR:Destroy()
DC_Impl(oScr)
nDauer := seconds() - nDauer
* MsgBox('Тотальный просмотра файла "Inp_data.csv" занял: '+ALLTRIM(STR(nDauer))+' секунд и показал, что в нем '+ALLTRIM(STR(N_ALL))+' строк')
* QUIT
***********************************************************************************************************************
// Подготовка данных для отображения графического прогресс-бар ********************************************************
***********************************************************************************************************************
// Начало отсчета времени для прогнозирования длительности исполнения
Time_progress = 0
// Прошло секунд с начала процесса
// Процесс может идти больше суток, поэтому для определения
// во всех случаях вычисляется время, прошедшее с начала года
T_Mess1 = L("Начало:")+" "+TIME() // Начало
Sec_1 = (DOY(DATE())-1)*86400+SECONDS()
// Отображение стадии исполнения. Будет написано прямо в окне Progress-bar
@ 0,0 DCGROUP oGroup1 CAPTION L('Стадии исполнения процесса') FONT "6.Helv" SIZE 105, 3.5 PARENT oTabPage1
@ 5,0 DCGROUP oGroup2 CAPTION L('Прогноз времени исполнения') FONT "6.Helv" SIZE 105, 5.0 PARENT oTabPage2
s = 1
@s++,1 DCSAY L(" ") SAYSIZE 100 SAYOBJECT aSay[ 1] FONT "10.Helv"
@s++,1 DCSAY L(" ") SAYSIZE 100 SAYOBJECT aSay[ 2] FONT "10.Helv"
s++
@s++,1 DCSAY L(" ") SAYSIZE 100 SAYOBJECT oSay97 FONT "10.HelvBold"
s++
@0.2+s++,1 DCSAY L(" ") SAYSIZE 100 SAYOBJECT oSay98 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
@1.5+s ,1 DCSAY L(" ") SAYSIZE 100 SAYOBJECT oSay99 FONT "9.Helv Bold" COLOR GRA_CLR_BLUE
@s , 1 DCPROGRESS oProgress SIZE 95,1.5 PERCENT ;
EVERY 1+INT(N_ALL/nEvery) ; // Кол-во обновлений изображения
MAXCOUNT N_ALL ;
COLOR GRA_CLR_CYAN // Цвет полосы
@s++,97 DCPUSHBUTTON CAPTION L('&Cancel') ;
ACTION {||lOk:=.T.} OBJECT oButton ;
SIZE 7,1.5
DCREAD GUI ;
TITLE L('CSV => DBF конвертер');
PARENT @oDialog ;
FIT ;
EXIT ;
MODAL
oDialog:show()
***********************************************************************************************************************
mMess = L('1/2-Определение в файле "Inp_data.csv" имен полей, их длин и типов данных в них:')+' '
* mMess = L('2/2-Создание файла "Inp_data.dbf" и перенос в него данных из файла "Inp_data.csv":')+' '
PUBLIC T1 := (DOY(DATE())-1)*86400+SECONDS() // Время предыдущей индикации процесса исполнения
PUBLIC T2 := (DOY(DATE())-1)*86400+SECONDS()+1 // Текущее время (1-й раз оно заметно больше T1 чтобы было отображение)
nZeile = 0
oTR := HBTextReader( cFile ) // per Funktion
DO WHILE ! oTR:EOF()
nZeile++
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n"chste Zeile setzen !
* aZeile := Tokenize(cZeile, "," )
FOR j=1 TO nField
aFieldVal[j] = ALLTRIM(TOKEN(cZeile, ',', j))
NEXT
* MsgBox(cZeile)
*** Если в поле хотя бы раз встретилось текстовое значение, то оно имеет тип данных "текстовое"
*** Числовой тип данных только если все значения числовые (или пробел)
FOR j=1 TO nField
mValS = ALLTRIM(aFieldVal[j])
mFlagIsNumber = .T. // Флаг = .T., если число
mLenVal = LEN(mValS)
IF mLenVal > 0
FOR i=1 TO mLenVal
mASC = ASC(SUBSTR(mValS,i,1)) // ASCII-код i-го символа
// Если ВСЕ значения поля символы имеют коды цифр: 0123456789, "+", "-" или ".", то это число
IF 48 <= mASC .AND. mASC <= 57 .OR. mASC = 46 .OR. mASC = 43 .OR. mASC = 45
ELSE
mFlagIsNumber = .F. // Флаг = .T., если число
EXIT
ENDIF
NEXT
ENDIF
IF mFlagIsNumber
mPos = AT('.',mValS)
IF mPos > 0
aFieldDeci[j] = LEN(mValS)-mPos
ENDIF
* MsgBox(STR(j)+', "N", ' +mValS)
ELSE
aFieldType[j] = 'C'
* MsgBox(STR(j)+', "C", ' +mValS)
ENDIF
aFieldSize[j] = MAX(aFieldSize[j], LEN(mValS))
NEXT
lOk = Time_Progress (++Time_Progress, 2*N_ALL, oProgress, lOk )
mNumPP = nZeile;PercTimeVisio(1, mMess, N_ALL) // Индикация процесса исполнения
ENDDO
oTR:Destroy()
mMess = L('2/2-Создание файла "Inp_data.dbf" и перенос в него данных из файла "Inp_data.csv":')+' '
**** Создание DBF для данных из CSV-файла ********
aStructure := { { aFieldName[1], aFieldType[1], aFieldSize[1], aFieldDeci[1] } }
IF nField > 1
FOR j=2 TO nField
AADD(aStructure, { aFieldName[j], aFieldType[j], aFieldSize[j], aFieldDeci[j] })
NEXT
ENDIF
DbCreate( 'Inp_data', aStructure )
****** Преобразование CSV => DBF *******************************
CLoseAll() // Закрытие всех баз данных с ожиданием завершения операций
USE Inp_data EXCLUSIVE NEW
mRecSize = RECSIZE() // Определить размер одной записи БД Inp_data.dbf
m2Gb = 2 * 2 ^ 30 // 2 Gb
oTR := HBTextReader( cFile ) // per Funktion
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n"chste Zeile setzen !
nZeile = 0
DO WHILE ! oTR:EOF()
cZeile := oTR:GetLine() // aktuelle Zeile einlesen, Zeiger intern auf n"chste Zeile setzen !
* aFieldVal = Tokenize(cZeile, "," )
* MsgBox(STR(nZeile)+' '+cZeile)
FOR j=1 TO nField
aFieldVal[j] = ALLTRIM(TOKEN(cZeile, ',', j))
NEXT
FOR j=1 TO nField
IF aFieldType[j] = 'N'
aFieldVal [j] = VAL(aFieldVal[j])
ENDIF
NEXT
mFlag2Gb = .F.
nZeile++
IF mRecSize * (nZeile+1) > m2Gb // Базу больше 2 Гб не записывать или записывать в дургие файлы: Inp_data-###.dbf
mFlag2Gb = .T.
EXIT
ELSE
APPEND BLANK
FOR j=1 TO nField
FIELDPUT(j, aFieldVal[j])
NEXT
ENDIF
lOk = Time_Progress (++Time_Progress, 2*N_ALL, oProgress, lOk )
mNumPP = nZeile;PercTimeVisio(2, mMess, N_ALL) // Индикация процесса исполнения
ENDDO
lOk = Time_Progress (2*N_ALL, 2*N_ALL, oProgress, lOk )
oTR:Destroy()
CLOSE ALL
DIRCHANGE(Disk_dir) // Перейти в папку с исп.модулем системы Эйдос
MILLISEC(10000)
IF mFlag2Gb
Mess = L('Конвертация CSV => DBF прервана, т.к. "Inp_data.dbf" > 2 Гб')
ELSE
Mess = L('Преобразование: CSV => DBF завершено! "Inp_data.dbf" < 2 Гб')
ENDIF
* LB_Warning(Mess, L('(C) Система "Эйдос"'))
Running(.T.) // Чтобы не могли запустить какой-нибудь режим пока висит окно окончания работы
oSay97:SetCaption(Mess)
oSay97:SetCaption(oSay97:Caption)
oButton:SetCaption(L('&Ok')) // Деструктурирование окна отображения графического Progress-bar
oButton:activate := {||PostAppEvent(xbeP_Close,,,oDialog)} //<<<<<< Add This
DC_AppEvent( @lOk )
oDialog:Destroy()
RETURN NIL
********************************************************************************
********************************************************************************
- Dateianhänge
-
- Untitled-1.jpg (92.26 KiB) 8025 mal betrachtet
Zuletzt geändert von Eugeny Lutsenko am Mi, 21. Okt 2020 6:46, insgesamt 1-mal geändert.
- AUGE_OHR
- Marvin
- Beiträge: 12912
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi,
ohne Testdaten und funktionsfähigem Demo wird dir kaum einer helfen können.
CSV Dateien die nicht funktionieren sollte man sich im HEX Editor ansehen ob da störende Zeichen sind.
ansonsten DEBUGGER benutzen um zu beobachten was dein Code macht.
ohne Testdaten und funktionsfähigem Demo wird dir kaum einer helfen können.
CSV Dateien die nicht funktionieren sollte man sich im HEX Editor ansehen ob da störende Zeichen sind.
ansonsten DEBUGGER benutzen um zu beobachten was dein Code macht.
gruss by OHR
Jimmy
Jimmy
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi!
Hat ein funktionierendes Beispiel (beigefügt) mit der Anzeige der Prognose und der Ausführungszeit gemacht. Und das lustige ist, dass es gut funktioniert. Und im System Stoppt der Prozess nicht, sondern geht weiter. Jetzt werde ich noch Experimentieren.
Hat ein funktionierendes Beispiel (beigefügt) mit der Anzeige der Prognose und der Ausführungszeit gemacht. Und das lustige ist, dass es gut funktioniert. Und im System Stoppt der Prozess nicht, sondern geht weiter. Jetzt werde ich noch Experimentieren.
- Dateianhänge
-
- Безымянный.jpg (67.11 KiB) 8073 mal betrachtet
-
- 3.zip
- (124.76 KiB) 236-mal heruntergeladen
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Danke. Das habe ich getan. Arbeitet schnell mit Funktionen von brandelh. Auf 4 Millionen Datensätze erfährt wie viele von Ihnen nur 14 Sekunden.ramses hat geschrieben: ↑Mo, 19. Okt 2020 12:35Etwas schnelles gibt es vermutlich nicht.Eugeny Lutsenko hat geschrieben: ↑Mo, 19. Okt 2020 12:29 Wie kann ich die Anzahl der Datensätze in einer csv-Datei schnell herausfinden?
Das einzige was mir für grosse Dateien einfällt ist die Datei abarbeiten und dabei die CRLF zu zählen.
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Aus irgendeinem Grund wurden die zahlen nicht mehr identifiziert. Jetzt werde ich korrigieren
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hi!
Korrigiert die Identifizierung der Nummer. Im debug-Beispiel am Ende wird der Prozess normalerweise beendet, wie es sein sollte. Und wenn Sie es in das Hauptprogramm einfügen, wird der Prozess ohne Unterbrechung am Ende der Funktion fortgesetzt. Ich habe dort eine kleine Pause gemacht, damit es zumindest sichtbar ist, dass die Konvertierung beendet ist. Das Ergebnis der Konvertierung ist korrekt. Überprüft auf csv-Datei 4 Millionen Datensätze.
Korrigiert die Identifizierung der Nummer. Im debug-Beispiel am Ende wird der Prozess normalerweise beendet, wie es sein sollte. Und wenn Sie es in das Hauptprogramm einfügen, wird der Prozess ohne Unterbrechung am Ende der Funktion fortgesetzt. Ich habe dort eine kleine Pause gemacht, damit es zumindest sichtbar ist, dass die Konvertierung beendet ist. Das Ergebnis der Konvertierung ist korrekt. Überprüft auf csv-Datei 4 Millionen Datensätze.
- Dateianhänge
-
- 4.zip
- (179.63 KiB) 150-mal heruntergeladen
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Ich habe auch bemerkt, dass jetzt die Größe der dbf-Datei etwa 2 mal größer ist als zuvor mit der gleichen ursprünglichen csv-Datei. Also werde ich noch zusehen.
- Tom
- Der Entwickler von "Deep Thought"
- Beiträge: 9390
- Registriert: Do, 22. Sep 2005 23:11
- Wohnort: Berlin
- Hat sich bedankt: 104 Mal
- Danksagung erhalten: 363 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Xbase-Tabellen arbeiten mit fixierten Spaltenbreiten - ein Feld, das für 40 Zeichen Text vorgesehen ist, ist immer 40 Zeichen breit, ganz unabhängig davon, wie viel Text es enthält. CSV demgegenüber bietet als Redundanz nur die Anführungszeichen und die Separatoren.
Herzlich,
Tom
Tom
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Hey, Tom! Das verstehe ich. Ich meinte, dass in der vorherigen Version des Konverters aus derselben csv-Datei die dbf-Datei doppelt so klein war wie jetzt
- brandelh
- Foren-Moderator
- Beiträge: 15703
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 70 Mal
- Danksagung erhalten: 34 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Die Größe einer DBF hängt eindeutig und ausschließlich mit der Struktur und Anzahl der Datensätze zusammen.
Wenn Feldanzahl und Feldlänge gleich sind und die Anzahl der Datensätze auch, dann muss die Datei gleich lang sein.
Wenn Feldanzahl und Feldlänge gleich sind und die Anzahl der Datensätze auch, dann muss die Datei gleich lang sein.
Gruß
Hubert
Hubert
- AUGE_OHR
- Marvin
- Beiträge: 12912
- Registriert: Do, 16. Mär 2006 7:55
- Wohnort: Hamburg
- Hat sich bedankt: 19 Mal
- Danksagung erhalten: 46 Mal
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
hört sich nach Dubletten an ...Eugeny Lutsenko hat geschrieben: ↑Do, 22. Okt 2020 8:29 Ich habe auch bemerkt, dass jetzt die Größe der dbf-Datei etwa 2 mal größer ist als zuvor mit der gleichen ursprünglichen csv-Datei. Also werde ich noch zusehen.
gruss by OHR
Jimmy
Jimmy
- Eugeny Lutsenko
- Rekursionen-Architekt
- Beiträge: 108
- Registriert: Fr, 15. Mai 2020 16:16
- Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
- Hat sich bedankt: 12 Mal
- Danksagung erhalten: 1 Mal
- Kontaktdaten:
Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?
Ich habe noch die alte Version. Es funktioniert. ich werde die Leistung auf verschiedenen Dateien wiederherstellen