Forum | | | | - page 1 - |
|  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 |
| | | | |
| | | | | - page 1 - |
|  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 ▲ |
| |
| | | | - page 2 - |
| |  H.Brill | avec ASM pour un einzelnes marque trop ersetzen hat mir Volkmar une Proc gemacht :
Déclarer Memory bereich
CLS
Faible bereich, 1000
String bereich, 0 = "1,", "2,", "3,", "4,", "5,", "6,", "7,", "8,", "9,", "10"
//TranslateX(Bereich#, Size&, OrgChar%, NewChar%)
ASM "TranslateX", 4
PUSH EBX
PUSH ECX
PUSH EDX
PUSH ESI
MOV EDI, Par1// Adresse Quellstring
MOV ECX, Par2// Longueur Quellstring
MOV EBX, Par3// Code Suchzeichen
MOV EDX, Par4// Code Ersatzzeichen
MOV AL, BL
MOV AH, DL
XOR EDX, EDX// EDX effacer
chercher:
OU ECX, ECX// Quelllänge 0?
JZ IsLen// Longueur 0 erreicht, String par
DEC ECX// Longueur runter zählen
SCASB
JNZ chercher// Byte pas trouvé
MOV [EDI - 1], AH// Ersetzen
INC EDX// Ersetzen Zählen (peux entfallen)
JMP chercher
IsLen:
MOV EAX, EDX
POP ESI
POP EDX
POP ECX
POP EBX
EndASM
Imprimer Char$(bereich, 0, 40)
Imprimer «Imaginez ersetzt : ", Str$(TranslateX(bereich, SizeOf(bereich), Ord(»), Ord("|")))
Imprimer Char$(bereich, 0, 40)
WaitInput
Dispose bereich
Fin
peut-être peux du es oui brauchen. |
| | | 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 ▲ |
| |
| |  Christof Neuß | allô H.
vielen Dank pour Votre Bemühungen. oui, cela hilft réellement encore un peu plus. allez aussi 'ne coin plus rapide.
Genial wäre maintenant folgende ASM-Boucle:
Aufruf avec TranslateX(Addr(Text$),Len(Text$)-1,a,b,c,d,e,f,g,h,k,l,m,n,o,p,q,r) Wobei a-h Buchstaben(codes) sommes, pour denen gesucht wird et k-r qui Buchstaben(codes) sommes, qui pour eingesetzt volonté. So pourrait je dans einem Aufwasch juste plusieurs Ersetzungen faire (z.B. Tab vers "|" et "/" vers " " et ... Dabei wird qui Longueur des Cordes pas modifié. un marque wird vers oui c'est ca un d'autre marque ausgetauscht.
Aussi habe je (malheureusement) aussi encore so quelque chose trop ersetzen: "|||" vers "|0|0|". mais cela serait qui Longueur des Cordes verändern. Muss pas absolument son. cela allez letztlich aussi sur Translate$ assez fix.
Salut
Christof |
| | | | |
| |  H.Brill | peut-être aider dir là aussi qui regulären Ausdrücke plus. avec Set("RegEx", 1) eingeschaltet, wirken qui aussi beim XProfan-eigenen Translate$. justement cela dernier, "|||" vers "|0|0|" auszutauschen, wäre pas schwer. cela Suchmuster hierfür wäre : neuerstring$ = Translate$(alterstring$, "[|||]{3,3}", "|0|0|")
aussi pour cela chercher de Gruppen [a-h] o.ä. sommes oui qui reg. Ausdrücke très approprié.
Lies dir fois le Aider en supplément par. chez Fragen peux du toi oui annoncer. |
| | | 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. | 17.09.2018 ▲ |
| |
|
répondreOptions du sujet | 10.002 Views |
Themeninformationencet Thema hat 4 participant: |