Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Eigentlich ist mir die Frage peinlich, aber es kann sonst niemand helfen ... :)

Moderator: Moderatoren

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Sa, 17. Okt 2020 19:23

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

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » So, 18. Okt 2020 22:31

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.

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 10 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh » Mo, 19. Okt 2020 0:07

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.
Gruß
Hubert

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mo, 19. Okt 2020 6:36

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
Dateianhänge
1.zip
(56.48 KiB) 5-mal heruntergeladen

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 1 Mal
Danksagung erhalten: 7 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von ramses » Mo, 19. Okt 2020 11:40

Hallo Eugeny
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
Das kann nicht sein.
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.
dbfgross.jpg
dbfgross.jpg (31.69 KiB) 320 mal betrachtet
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

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mo, 19. Okt 2020 12:29

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?

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 1 Mal
Danksagung erhalten: 7 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von ramses » Mo, 19. Okt 2020 12:35

Eugeny Lutsenko hat geschrieben:
Mo, 19. Okt 2020 12:29
Wie kann ich die Anzahl der Datensätze in einer csv-Datei schnell herausfinden?
Etwas schnelles gibt es vermutlich nicht.
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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 10 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh » Mo, 19. Okt 2020 13:04

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

flanelli
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 112
Registriert: Di, 11. Mai 2010 16:27
Danksagung erhalten: 2 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von flanelli » Mo, 19. Okt 2020 14:46

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
Ahoile aus dem Süden

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 10 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh » Mo, 19. Okt 2020 15:40

der Link ist interessant, mein MED geht bei 300 MB aufwärts in die Knie ...
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12480
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 5 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR » Mo, 19. Okt 2020 18:21

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.
gruss by OHR
Jimmy

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mo, 19. Okt 2020 18:53

ramses hat geschrieben:
Mo, 19. Okt 2020 11:40
Hallo Eugeny
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
Das kann nicht sein.
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.
Ich denke, mein Niveau als Programmierer ist nicht das, was ich mir gewünscht hätte...

ramses
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 1902
Registriert: Mi, 28. Jul 2010 17:16
Hat sich bedankt: 1 Mal
Danksagung erhalten: 7 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von ramses » Mo, 19. Okt 2020 21:39

Hallo Eugeny
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...
Nein das denke ich nicht.

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, "," )
verwendest MUSST du in deiner For Next Schleife

Code: Alles auswählen

FOR j=1 TO nField
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

Code: Alles auswählen

FOR j=1 TO nField
          aFieldVal[j] = ALLTRIM(TOKEN(cZeile, ',', j))
      NEXT
kann dies nicht vorkommen weil du sichergestellt hast dass das Array IMMER die korrekte Länge hat. Fehlende Token sind einfach leer.
Valar Morghulis

Gruss Carlo

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Di, 20. Okt 2020 23:54

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
Untitled-1.jpg (92.26 KiB) 178 mal betrachtet
Zuletzt geändert von Eugeny Lutsenko am Mi, 21. Okt 2020 6:46, insgesamt 1-mal geändert.

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12480
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 5 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR » Mi, 21. Okt 2020 2:28

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.
gruss by OHR
Jimmy

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mi, 21. Okt 2020 7:28

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.
Dateianhänge
Безымянный.jpg
Безымянный.jpg (67.11 KiB) 175 mal betrachtet
3.zip
(124.76 KiB) 2-mal heruntergeladen

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mi, 21. Okt 2020 7:50

ramses hat geschrieben:
Mo, 19. Okt 2020 12:35
Eugeny Lutsenko hat geschrieben:
Mo, 19. Okt 2020 12:29
Wie kann ich die Anzahl der Datensätze in einer csv-Datei schnell herausfinden?
Etwas schnelles gibt es vermutlich nicht.
Das einzige was mir für grosse Dateien einfällt ist die Datei abarbeiten und dabei die CRLF zu zählen.
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.

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mi, 21. Okt 2020 10:28

Aus irgendeinem Grund wurden die zahlen nicht mehr identifiziert. Jetzt werde ich korrigieren

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Mi, 21. Okt 2020 11:16

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.
Dateianhänge
4.zip
(179.63 KiB) 2-mal heruntergeladen

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » 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.

Benutzeravatar
Tom
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 8197
Registriert: Do, 22. Sep 2005 23:11
Wohnort: Berlin
Hat sich bedankt: 7 Mal
Danksagung erhalten: 28 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von Tom » Do, 22. Okt 2020 11:32

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

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Do, 22. Okt 2020 19:21

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

Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15268
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 10 Mal
Danksagung erhalten: 7 Mal
Kontaktdaten:

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von brandelh » Fr, 23. Okt 2020 3:00

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.
Gruß
Hubert

Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12480
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 3 Mal
Danksagung erhalten: 5 Mal

Re: Wie kann ich eine sehr große csv-Datei (mehr als 4 Millionen Zeilen) in die Datenbank eingeben?

Beitrag von AUGE_OHR » Fr, 23. Okt 2020 6:22

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.
hört sich nach Dubletten an ...
gruss by OHR
Jimmy

Benutzeravatar
Eugeny Lutsenko
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 49
Registriert: Fr, 15. Mai 2020 16:16
Wohnort: Russland, der südliche Föderale Bezirk, die Stadt Krasnodar
Hat sich bedankt: 6 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?

Beitrag von Eugeny Lutsenko » Fr, 23. Okt 2020 6:45

Ich habe noch die alte Version. Es funktioniert. ich werde die Leistung auf verschiedenen Dateien wiederherstellen

Antworten