Français
Forum

Translate beschleunigen (Translate$ ou bien nproc Translate)

 
- 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
 
XProfan X3
Win10 16 GB RAM
10.09.2018  
 



 
- 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.
 
XProfan X4
Windows XP SP2 XProfan X4
... und hier mal was ganz anderes als Profan ...
10.09.2018  
 




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...
 
XProfan X4
Win10 16 GB RAM
10.09.2018  
 




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 :
Déclarer String a[200000]
Cls
Mat a[] = "Hallo, du, là !"
Imprimer "Fertig..."
Set("MoveListMode", 1)
Imprimer Move("ArrToList", a[])
Imprimer GetString$(0, 100000)
MoveListProc
Paramètres String s, int index
Déclarer String z

Si Get("MoveListMode") = 1

    z = Translate$(s, », "|")
    AddStrings z

EndIf

ENDPROC

WaitKey

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.
 
XProfan X4
Win10 16 GB RAM
10.09.2018  
 




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.
 
XProfan X4
Win10 16 GB RAM
13.09.2018  
 




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) :
'liste$ ist une auparavant ausgewählte Dossier
Faible Bereich#, FileSize(liste$)
BlockRead(liste$, Bereich#, 0, FileSize(liste$))

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
 
XProfan X4
Win10 16 GB RAM
17.09.2018  
 




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épondre


Topictitle, max. 100 marque.
 

Systemprofile:

ne...aucune Systemprofil angelegt. [anlegen]

XProfan:

 Posting  Font  Smilies  ▼ 

s'il te plaît s'inscrire um une Beitrag trop verfassen.
 

Options du sujet

10.002 Views

Untitledvor 0 min.
Sven Bader20.03.2023
Walter05.06.2022
Rolf Koch11.11.2021
Michael Hettner02.09.2021
plus...

Themeninformationen



Admins  |  AGB  |  Applications  |  Auteurs  |  Chat  |  protection des données  |  Télécharger  |  Entrance  |  Aider  |  Merchantportal  |  Empreinte  |  Mart  |  Interfaces  |  SDK  |  Services  |  Jeux  |  cherche  |  Support

un projet aller XProfaner, qui il y a!


Mon XProfan
Privé Nouvelles
Eigenes Ablageforum
Sujets-La liste de voeux
Eigene Posts
Eigene Sujets
Zwischenablage
Annuler
 Deutsch English Français Español Italia
Traductions

protection des données


Wir verwenden Cookies seulement comme Session-Cookies à cause de qui technischen Notwendigkeit et chez uns gibt es aucun Cookies de Drittanbietern.

si du ici sur unsere Webseite klickst ou bien navigierst, stimmst du unserer Erfassung de Informationen dans unseren Cookies sur XProfan.Net trop.

Weitere Informationen trop unseren Cookies et en supplément, comment du qui Kontrolle par-dessus behältst, findest du dans unserer nachfolgenden Datenschutzerklärung.


d'accordDatenschutzerklärung
je voudrais keinen Cookie