Forum | | | |  Christof Neuß | Salut,
je hexe la fois wieder avec grand CSV-Fichiers herum. veux cet possible vite et simple dans un SQLite-banque de données überführen. cela funktioniert aussi grundsätzlich, mais c'est mir à einigen se mettre encore trop lente.
2 Alternativen verfolge je justement a) Einlesen qui CSV phrase pour phrase, Anpassung à Insert-Befehl et einlesen b) Aufbau einer passenden CSV-Dossier pour den importation-Befehl qui SQLite-Console et ensuite sur Batchdatei starten.
variante a) ist ici (erstmal) pas maßgeblich, là phrase-Contribution eh plutôt trop lente ist.
chez variante b) bekomme je es simple pas hin, qui SQLite-Console avec einem paramètre trop versehen, qui TAB comme Feldtrenner mets (\t funktioniert pas), daher voudrais je qui Dossier (jusqu'à 1 GB grand) auparavant vom TAB befreien et z.B. ";" comme Feldtrenner mettons. je lese en supplément sur Blockread toujours 1.000.000 Bytes un, bearbeite cet et schreibe vous dans un neue Dossier. Experimentiert habe je avec Translate$ et Translate comme nproc. Beide brauchen chez mir ca. 30 Sekunden, jusqu'à vous 1 MB geändert avons. j'ai ensuite qui nproc quelque chose abgeändert, là je seulement un marque tauschen veux
Braucht mais presque genauso longtemps.
Sieht einer une Possibilité, dass encore - entscheidend - trop beschleunigen?
c'est (aussi) c'est pourquoi pas entier simple, qui CSV-Fichiers dans un SQLite-DB trop übertragen, weil je pas toujours sûrement auparavant sais, avec welchem marque qui Felder getrennt sommes et si es sich um une Dossier avec einfachen ou bien WideChar handelt. Beide kriege je mittlerweile mais relativ vite et sûrement raus.
ici qui komplette Code des Moduls:
nProc translateONE(string src,fnd,rpl)
{
long p=1,cc=len(src), akt=0
cas cc<1 : return src
cas src==» : return »
cas fnd==» : return src
long fndCH=fnd[1]
string sret=»', akt=""
tandis que 1
{
cas p > cc : pause
si src[p]<>fndCH
{
akt=src[p]
sret=sret+chr$(akt)
} d'autre
{
sret=sret+rpl
}
add p,1
continue
}
return sret
}
Proc CSV_in_SQLite_2'ici wird avec einem Batchfile gearbeitet
'Dateiname, qui lire volonté soll
'Bezeichnung qui Tabelle dans SQLite
'0=keine annonce, 1=MessageBox am Schluss
Paramètres CSVDateiname$, EinleseTabelle$, MsgBox&
Var TempErgebnis$="Temp_CSV_f_SQLite.CSV"
Var IstWideChar&=0
Var EinleseDaten$=»
Déclarer EinleseDaten#
Var EinleseBytes&=1000000'ici peux eingestellt volonté, wieviele Bytes beim Blockread chaque la fois lire volonté
Var Eingelesen&=0
Var EinleseSatz$=»
Var EinleseFelder$=»
Var AnzEinleseFelder&=0
Var FeldTrenner$=»
Var SQLiteDLL&=db("slUseDLL","SQLite3.DLL")
Var dbODVAss&=db("slInit","ODVAss.DB")
Var SQLBefehl$=»
Var x&=0
Var XX&=Fortschritt()
Var Zaehl&=0
Effacer TempErgebnis$
Assign #1, CSVDateiname$ : OpenRW #1
Assign #2, TempErgebnis$ : OpenRW #2
'Umwandlung dans Dossier sans WideChar...
Faible EinleseDaten#, EinleseBytes&
Eingelesen&=Blockread(#1,EinleseDaten#,0,EinleseBytes&)
si Char$(EinleseDaten#,0,1)=Chr$(255)'Dossier avec WideChar
IstWideChar&=1
endif
si IstWideChar&=1
EinleseDaten$=EinleseDaten$+WideChar(EinleseDaten#,0,Eingelesen&)
d'autre
'normaler Zeichensatz
EinleseDaten$=EinleseDaten$+Char$(EinleseDaten#,0,Eingelesen&)
endif
EinleseFelder$=Left $(EinleseDaten$,InStr(Chr$(10),EinleseDaten$)-1)'avec cela avons wir qui Überschriften
EinleseFelder$=Translate$(EinleseFelder$,Chr$(9),"¦")
'Einlesedaten$ bleibt simple so. ensuite sommes qui Überschriften dans qui ersten la ligne
'EinleseDaten$ =Mid$(EinleseDaten$,InStr(Chr$(10),EinleseDaten$)+1,InStr(Chr$(0),EinleseDaten$)-Len(EinleseFelder$)-2) 'avec cela sommes qui Überschriften raus
si Instr(Chr$(0),EinleseDaten$)<>0
EinleseDaten$=Left $(EinleseDaten$,Instr(Chr$(0),EinleseDaten$)-1)
endif
Zaehl&=Zaehl&+Len(EinleseDaten$,Chr$(10))
Imprimer "Anfang"
EinleseDaten$=TranslateONE(EinleseDaten$,Chr$(9),"¦")
Imprimer "Ende erster Satz"
Blockwrite #2, EinleseDaten$
WhileLoop 10000'qui Wert wird wohl nie erreicht volonté
SetText XX&, format$("###,###,###",&Boucle)
Dispose EinleseDaten#
EinleseDaten$=»
Faible EinleseDaten#, EinleseBytes&
Eingelesen&=Blockread(#1,EinleseDaten#,0,EinleseBytes&)
si IstWideChar&=1
EinleseDaten$=WideChar(EinleseDaten#,0,Eingelesen&)
d'autre
'normaler Zeichensatz
EinleseDaten$=Char$(EinleseDaten#,0,Eingelesen&)
endif
si Instr(Chr$(0),EinleseDaten$)<>0
EinleseDaten$=Left $(EinleseDaten$,Instr(Chr$(0),EinleseDaten$)-1)
endif
Imprimer "Anfang "+Str$(&Boucle)
EinleseDaten$=TranslateONE(EinleseDaten$,Chr$(9),"¦")
Imprimer "Ende "+Str$(&Boucle)
Zaehl&=Zaehl&+Len(EinleseDaten$,Chr$(10))
Blockwrite #2, EinleseDaten$
si eof(#1)
Pause
endif
Endwhile
Fermer #1
Fermer #2
'Erstellen Table dans dbODVAss...
'Datenbanktabelle erstellen/bereinigen
si db("slTableExists",dbODVAss&,EinleseTabelle$)<>0'Tabelle existiert, ensuite effacer
SQLBefehl$="Drop Table "+EinleseTabelle$
db("slSQLExec",dbODVAss&, SQLBefehl$,1)
endif
'Felder dans Tabelle Tab_Felder eintragen bzw. auparavant vorhandene effacer
si db("slTableExists",dbODVAss&,"Tab_Felder")<>0'Tabelle existiert
SQLBefehl$="Delete à partir de Tab_Felder where TabName='"+EinleseTabelle$+"'"
db("slSQLExec",dbODVAss&, SQLBefehl$,1)
d'autre
SQLBefehl$="Create Table Tab_Felder (TabName, FeldName, FeldBezei, FeldArt)"
db("slSQLExec",dbODVAss&, SQLBefehl$,1)
endif
'Feldtrenner dans Originaldatei bestimmen
si Len(EinleseFelder$,"¦")>Len(EinleseFelder$,";")
FeldTrenner$="¦"
d'autre
FeldTrenner$=";"
endif
si Len(EinleseFelder$,»)>Len(EinleseFelder$,FeldTrenner$)
FeldTrenner$=»
endif
'Felder aus qui aktuellen Tabelle eintragen ==> Feldtrenner ist ensuite un Komma
EinleseFelder$=TranslateONE(EinleseFelder$,Chr$(9),";")
EinleseFelder$=TranslateONE(EinleseFelder$,»,".")
EinleseFelder$=TranslateONE(EinleseFelder$,";",»)
EinleseFelder$=Translate$(EinleseFelder$,",,,",",0,0,")
EinleseFelder$=Translate$(EinleseFelder$,",,",",0,")
EinleseFelder$=Translate$(EinleseFelder$,", ,",",0,")
EinleseFelder$=TranslateONE(EinleseFelder$,»,»)
AnzEinleseFelder&=Len(EinleseFelder$,»)
WhileLoop AnzEinleseFelder&
SQLBefehl$="Insert into Tab_Felder (TabName, FeldName, FeldBezei) Values ('"+EinleseTabelle$+"','F"+Format $("0000",&Boucle)+"','"+Substr$(EinleseFelder$,&Boucle,»)+"')"
db("slSQLExec",dbODVAss&, SQLBefehl$,1)
Endwhile
EinleseFelder$="("
WhileLoop AnzEinleseFelder&'après sommes dans EinleseFelder$ qui (neuen) F...-Bezeichnungen
EinleseFelder$=EinleseFelder$+"F"+Format $("0000",&Boucle)+»
Endwhile
EinleseFelder$=left$(EinleseFelder$,Len(EinleseFelder$)-1)+")"
SQLBefehl$="Create Table "+EinleseTabelle$+" "+EinleseFelder$
db("slSQLExec",dbODVAss&, SQLBefehl$,1)
db("slDone",dbODVAss&)
FreeDll SQLiteDLL&
'Einlesen Datensätze dans dbODVAss...
'SL-Dossier erstellen
Effacer "SQLite_Import.sl"
Assign #1, "SQLite_Import.sl" : Rewrite #1
Imprimer #1, "Delete à partir de "+EinleseTabelle$+";"
'Imprimer #1, ".separator "+FeldTrenner$
'Imprimer #1, ".mode csv"
Imprimer #1, ".importation Temp_CSV_f_SQLite.CSV "+EinleseTabelle$
Fermer #1
'Batchdatei erstellen
Effacer "SQLite_Import.bat"
si FeldTrenner$=Chr$(9)
FeldTrenner$=Chr$(34)+"\\t"+Chr$(34)
endif
Assign #1, "SQLite_Import.bat" : Rewrite #1
Imprimer #1, "@écho off"
Imprimer #1, "SQLite3.exe -separator "+FeldTrenner$+" ODVAss.DB < SQLite_Import.SL"
'Imprimer #1, "Pause"
Fermer #1
ChDir $PROGDIR
SQLBefehl$="SQLite_Import.bat"
WinExecWait(SQLBefehl$,1)
DestroyWindow(WegwerfFenster&)
Effacer TempErgebnis$
si MsgBox&=1
MessageBox("Daten wurden dans qui banque de données geladen!","Meldung",0)
endif
ENDPROC
Merci et viele Grüße
Christof |
| | | | |
| |  H.Brill | la hâte du XProfanX4 ? si, ensuite pourrait on peut-être. encore quoi beschleunigen, indem on qui MoveListProc einsetzt. là hat on Zugriff sur alle Move("….ToList", ….) - Funktionen. avec Move("FileToList, Dossier$) hättest du ensuite Einzelzugriff sur chacun la ligne qui Dossier. là könntest du ensuite den Insert- Befehl anpassen et ensuite direct dans qui DB écrivons. qui Listboxliste ist ensuite seulement Mittel zum Zweck et wird pas ausgewertet.
je empfehle es c'est pourquoi, weil Rolands interne Schleifen doch wesentlich plus rapide courir, comme qui eigenen im Programmcode. on devrait wirklich la fois une realen Test avec grand Datenmengen faire. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 10.09.2018 ▲ |
| |
| |  Christof Neuß | Hi,
oui, j'ai X4. Muss je la fois ausprobieren. suis mir seulement pas sûrement, si qui liste réellement sur 3 Mio. Zeilen aufnehmen/auswerten peux.
quand même: Einen Versuch ist's wert. merci pour den Tipp!
Salut
Christof |
| | | | |
| |  H.Brill | 3 Mio. Zeilen ist ne la quantité  je crois, so 260.000 ist cela höchste, quoi qui Listboxliste aufnehmen peux. on pourrait sich mais behelfen, indem on den index (2.paramètre) überprüft. si cette z.B. 250.000 erreicht, simple qui liste effacer. Um cela etappenweise trop bewerkstelligen, doit on arrêt avec index MOD 250.000 überprüfen. Müßte on la fois essayer. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 10.09.2018 ▲ |
| |
| |  Jörg Sellmeyer | Musst du qui Dossier car absolument zeilenweise Travailler? si du qui données comme CSV vorliegen la hâte, peux du qui doch simple dans une String magasin et den einmal avec Translate verwursten et déjà devrait alle Trenner ersetzt son. si je es richtig dans Erinnerung habe, ist qui maximale Stringlänge par den RAM begrenzt - sollte bon alors ne...aucune ernsthaftes Problem représenter. |
| | | | |
| |  Christof Neuß | Tja... oui c'est ca avec cela laboriere je oui déjà un paire Tage rum...
- chez ca. 260.000 Zeilen ist Schluss. Wäre oui aussi trop joli gewesen um véritable trop son. Relatif à la zweiten paramètre habe je pas verstanden.
- Erstens peux on 1 GB pas la fois so simple dans une String einlesen (là venez plutôt un Speicherfehler, comme on croyez) et zweitens habe je quelque chose comme déjà versucht... Pour sur 2 Stunden Laufzeit habe je cela Programme abgebrochen.
Werde je wohl et avec ca tüfteln doit... |
| | | | |
| |  H.Brill | qui zweite paramètre ist arrêt qui index. chez Move("ArrToList", a[]) ist es z.B. qui index des Arrays a[index]. chez FileToList devrait es ensuite qui jeweilige la ligne qui Dossier son.
cela ergibt qui Possibilité z.B. seulement Teile eines Arrays dans qui Listboxliste trop schieben, indem on den index avec > ou bien < abfragt.
qui MoveListProc scheint là aussi pas allzu vite trop son :
ici sieht on joli, comment vite un MAT allez à qui Proc. tant pis, qui chez MAT seulement feste Ausdrücke aller. Incidemment : du brauchst oui chez qui MoveListProc qui Listboxliste gar pas trop benutzen. Es liegt oui dans deinem Gusto, quoi du avec dem String s et dem Int i anstellst.
Grob dit, stellt Roland den index et den en supplément gehörenden Wert (comme String) qui trop movenden liste/ Array/File zur Disposition. qui MoveListProc ist ensuite, comment un Schleifenkörper : WhileLoop .... Endwhile |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 10.09.2018 ▲ |
| |
| |  Christof Neuß | Hi,
merci. Wieder quoi gelernt. 
la fois voyons, si/comment je cela gebrauchen peux. |
| | | | |
| |  H.Brill | peut-être peux on oui aussi avec dem Inline-ASM quelque chose nachhelfen. exposition la fois dans Paules Forum. Zumindest, quoi Schleifen betrifft. aussi cela Translate$() ließe sich avec cela ersetzen bzw. wäre comme ASM-Proc plus rapide.
Evtl. peux dir diesbezüglich quelqu'un quoi bricoler. Volkmar ist là un bon Ansprechpartner.
Schneller comme ASM allez pas plus. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 11.09.2018 ▲ |
| |
| |  Christof Neuß | BTW: Gibt es une Begrenzung chez Blockread et/ou bien Blockwrite? si je plus que 1 MB einlesen veux, bekomme je une Fehlermeldung.
Exception EAccessViolation dans Modul... Zugriffsverletzung chez Adresse...
Hab' qui frontière pas oui c'est ca ausgetestet, mais avec 1.000.000 Bytes hat's encore funktioniert, chez 1.200.000 pas plus. |
| | | | |
| |  E.T. | .... grad la fois probiert et via Blockread 23,5 MB dans une Bereich lire, sans Probleme....
(Ausschnitt aus einem Progg, wohin je cela so sans Probleme verwende) :
et ensuite arbeite je simple avec dem Bereich plus, ist oui ensuite qui ganze Dossier drinne et je peux avec cela faire, quoi je veux...
si nat. qui RAM ensuite ausgeht, muss on es "zerhackstückeln"  |
| | | Grüße aus Sachsen... Mario WinXP, Win7 (64 Bit),Win8(.1),Win10, Win 11, Profan 6 - X4, XPSE, und 'nen schwarzes, blinkendes Dingens, wo ich das alles reinschütte... | 13.09.2018 ▲ |
| |
| |  H.Brill | quoi on aussi prendre peux, ist Frank Abbings Listview.dll.
Déclarer Memory bereich, Long hdll, anz
hdll = UseDLL("Listview.dll")
ImportFunc(hdll, "ExchangeSeparator", "TranslateX")
CLS
Faible bereich, FileSize("E:\liste.txt")
Assign #1, "E:\liste.txt"
OpenRW #1
anz = BlockRead(#1, bereich)
Fermer #1
Imprimer "Fertig..."
Imprimer "Taste zum Austausch"
WaitKey
TranslateX(bereich, FileSize("E:\liste.txt"), Ord(»),Ord("|"),1)
Imprimer "Fertig..."
Waitkey
Dispose bereich
FreeDLL hdll
Fin
voilà aucun Zeit messbar, so vite allez cela. 
PS: qui ProSpeed.dll de Frank hat là encore plus dans Sachen Bereiche trop bieten. |
| | | Benutze XPROFAN X3 + FREEPROFAN Wir sind die XProfaner. Sie werden von uns assimiliert. Widerstand ist zwecklos! Wir werden alle ihre Funktionen und Algorithmen den unseren hinzufügen.
Was die Borg können, können wir schon lange. | 15.09.2018 ▲ |
| |
|
répondreOptions du sujet | 10.009 Views |
Themeninformationencet Thema hat 4 participant: |