| |
Fragen und Antworten zur vbarchiv.dllarrFindString sehr langsam | | | Autor: d.jeschke | Datum: 15.11.05 15:25 |
| Hallo,
erstmal vielen Dank für diese kostenlose dll.
Aber folgendes Problem beschäftigt mich:
Ich lese in ein Array eine Liste mit ca. 450.000 Einträgen ein.
Nun möchte ich auf doppelte Begriffe im Array prüfen.
Das Array liegt sortiert durch die TextCompare Methode vor.
Das Suchen im Array auf doppelte Einträge sequentiell ist ja keine problem, dauert nur sehr lange. Deswegen habe ich mir die InArray Funktion von D.Otter genommen und lasse dadurch suchen. Dies geschieht sehr sehr schnell.
Der Nachteil dabei ist, dass es keine Möglichkeit gibt auf Groß/Kleinschreibung zu achten.
Deswegen habe ich die arrFindString Funktion aus der vbarchiv.dll ausprobiert.
Der Suchvorgang hierbei ist jedoch ziemlich langsam.
Kann ich davon ausgehen dass die Funktion auch sequentiell arbeitet?
Noch eine Frage:
Ist eine Array Sortierfunktion geplant?
Viele Grüße
Dennis | |
Re: arrFindString sehr langsam | | | Autor: d.jeschke | Datum: 15.11.05 16:17 |
| Hallo Martoeng,
vielen Dank für deine schnelle Reaktion!
Ja, ich habe auch schon über eine Datenbank nachgedacht. Aber als ich das Projekt begann wußte ich selber nicht dass es sich um soviele Einträge handelt.
Meinem Auftraggeber ist aber die Neuerstellung zu teuer.
Die arrSortString Funktion habe ich in der Dokumentation nicht gefunden. Dort wird nur die arrSortByte Funktion beschrieben.
Ich habe aber nun die arrSortString im Besipiel Code gefunden.
Nun noch eine Frage ob ich beim Aufruf der Funktion etwas verkehrt mache.
Zeile = arrFindString(FindList, SuchBegriff, "=", Zeile, EndZeile, 1)
Der Suchbegriff wird in einer Schleife bestimmt der jeweils den nächsten Index im Array markiert. Die Schleife funktioniert einwandfrei und auch die Begriffe werden korrekt übergeben. Trotzdem meldet mir die Funktion -1 zurück.
Eigentlich müßte er aber jeden Begriff mindestens einmal finden.
Was mache ich verkehrt?
Das folgende test Array überprüfe ich auf doppelte Werte:
FindList():
- oder kontraktilität\
%\
%-Creme\
%-Dosis\
%ig\
%-ig\
%ige\
%-ige\
%-igen\
%iger\
%-iger\
%ig-wässrig\
/µl\
/µl\
/cm²\
/m²\
/min\
/nl\
/pl\
/s\
dennis\
dennis\
dennis\
-Drehung\
inga\
inga\
Viele Grüße
Dennis | |
Re: arrFindString sehr langsam | | | Autor: d.jeschke | Datum: 15.11.05 16:58 |
| Ich benutze die version 00.09.0000
Die Declaration erfolgt auf Modulebene:
Public Declare Function arrFindString Lib "vbarchiv.dll" (ByRef Arr() As _
String, ByVal pSearch As String, ByVal sOperation As String, ByVal nStart As _
Long, ByVal nEnd As Long, ByVal bUCase As Byte) As Long Du kannst die ja mal den Code anschauen:
Public Function Optimize(sArray() As String, _
Optional ByVal sSerachFor As String, _
Optional ByVal nStart As Variant, _
Optional ByVal nEnd As Variant) As Long
' Sucht zur Zeit nur doppelte Einträge
Dim i As Long
Dim Zeile As Long
Dim CountBegriff As Integer
Dim SuchBegriff As String
Dim LastBegriff As String
Dim LastZeile As Long
s_txt.Text = ""
For i = 1 To EndZeile
SuchBegriff = flex_data(1).Text(i, 2)
Zeile = 1 ' Auf aunfang des Grids setzen
CountBegriff = 0 ' Gefundene Begriffe auf 0
If LastBegriff = SuchBegriff Then
Zeile = -1
End If
Do Until Zeile = -1
'Zeile = flex_data(1).FindItem(SuchBegriff, 2, Zeile, True)
' Mit InArray Funktion:
'Zeile = InArray(FindList, SuchBegriff, Zeile)
'arrFindString Funktion:
Zeile = arrFindString(FindList(), SuchBegriff, "=", Zeile, EndZeile, 1)
MsgBox ("Gesuchter Begriff: " & SuchBegriff & " Vergleichender String:" & _
"" & FindList(i) & " Resultat: " & Zeile)
If Zeile <> -1 Then
CountBegriff = CountBegriff + 1
If CountBegriff > 1 Then ' Wenn der Begriff öfters als
' einmal auftaucht
If CountBegriff = 2 Then
flex_data(2).AddItem (vbTab & SuchBegriff & vbTab & _
"" & vbTab & flex_data(1).Text(Zeile, 3) & vbTab _
& LastZeile)
flex_data(2).AddItem (vbTab & "--->" & vbTab & _
flex_data(1).Text(Zeile, 2) & vbTab & flex_data( _
1).Text(Zeile, 3) & vbTab & Zeile)
Else
flex_data(2).AddItem (vbTab & "--->" & vbTab & _
flex_data(1).Text(Zeile, 2) & vbTab & flex_data( _
1).Text(Zeile, 3) & vbTab & Zeile)
End If
Else
'flex_data(2).AddItem (SuchBegriff)
LastZeile = Zeile
End If
nCount = nCount + 1
If nCount Mod 50 = 0 Then
DoEvents
nCount = 0
End If
Zeile = Zeile + 1
LastBegriff = SuchBegriff
If Abbruch = True Then
Exit Function
End If
End If
Loop
If Abbruch = True Then
Exit Function
End If
nCount = nCount + 1
If nCount Mod 50 = 0 Then
DoEvents
nCount = 0
End If
s_txt.Text = i
Next i
cmd_delDoppelte.Enabled = True
End Function | |
Re: arrFindString sehr langsam | | | Autor: Braun | Datum: 16.11.05 13:54 |
| wie sucht diese Funktion die Daten?
Sequentiell, binär oder ..?
Braun | |
| Sie sind nicht angemeldet! Um auf diesen Beitrag zu antworten oder neue Beiträge schreiben zu können, müssen Sie sich zunächst anmelden.
Einloggen | Neu registrieren |
|
|
vb@rchiv CD Vol.6 vb@rchiv Vol.6
Geballtes Wissen aus mehr als 8 Jahren vb@rchiv!
Online-Update-Funktion Entwickler-Vollversionen u.v.m.Jetzt zugreifen Tipp des Monats Neu! sevDTA 3.0 Pro
SEPA mit Kontonummernprüfung
Erstellen von SEPA-Dateien mit integriertem BIC-Verzeichnis und Konto- nummern-Prüfverfahren, so dass ungültige Bankdaten bereits im Vorfeld ermittelt werden können. Weitere Infos
|