| |
Fragen und Antworten zur vbarchiv.dllRe: arrFindString sehr langsam | | | Autor: Braun | Datum: 16.11.05 13:54 |
| wie sucht diese Funktion die Daten?
Sequentiell, binär oder ..?
Braun | |
arrFindString 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 | |
| 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 |
|
|
sevISDN 1.0
Überwachung aller eingehender Anrufe!
Die DLL erkennt alle über die CAPI-Schnittstelle eingehenden Anrufe und teilt Ihnen sogar mit, aus welchem Ortsbereich der Anruf stammt. Weitere Highlights: Online-Rufident, Erkennung der Anrufbehandlung u.v.m. Weitere InfosTipp des Monats sevWizard für VB5/6
Professionelle Assistenten im Handumdrehen
Erstellen Sie eigene Assistenten (Wizards) im Look & Feel von Windows 2000/XP - mit allem Komfort und zwar in Windeseile :-) Weitere Infos
|