PDA

Visualizza la versione completa : [vb] metodo + veloce per eliminare duplicati


evil80
23-09-2002, 17:35
Ciao,
dovrei velocizzare un programma in vb che apre un file di testo contenente numeri o parole ed elimina i duplicati,poi salva il file con le modifiche.
Qual'è secondo voi il metodo più veloce ?

Sto parlando di qualcosa tipo 20.000 righe di file (o anche molte di più)...
Grazie.

Andrea Simonassi
23-09-2002, 19:56
Caricarlo tutto in memoria e elaborarlo in un colpo solo.

evil80
23-09-2002, 20:32
sto usando queso codice ma è lentissimo....
mi sapresti aiutare a migliorarlo ?




Private Sub CmdEsegui_Click()
Dim intFile As Integer
Dim intRitorno As Integer
Dim strTemp() As String
Dim strTestoOk() As String
Dim strTempOk As String
Dim lnC1 As Long
Dim lnC2 As Long
Dim lnC3 As Long
Dim lnC4 As Long
Dim lnTrovato As Long


'Assegna un numero valido per il file
intFile = FreeFile

'Apre il file
Open selected For Input As #intFile

'Legge l'intero contenuto del file e lo pone all'interno di un array riga per riga
lnC1 = 0
Do Until (EOF(intFile))
ReDim Preserve strTemp(lnC1)
Line Input #intFile, strTemp(lnC1)
lnC1 = lnC1 + 1
Loop

'Chiude il file
Close #intFile

lnC4 = 0

For lnC2 = LBound(strTemp) To UBound(strTemp)

lnTrovato = 0

For lnC3 = LBound(strTemp) To UBound(strTemp)

If strTemp(lnC2) = strTemp(lnC3) Then
lnTrovato = lnTrovato + 1
End If

Next

If lnTrovato = 0 Then
strTempOk = strTempOk & strTemp(lnC2) & " "
lnC4 = lnC4 + 1
End If

Next

ReDim strTestoOk(lnC4)
strTestoOk = Split(strTempOk, " ")

intFile = FreeFile
Open selected For Output As #intFile

For lnC4 = LBound(strTestoOk) To UBound(strTestoOk)
Put #intFile, , strTestoOk(lnC4)
Next

Close #intFile

intRitorno = MsgBox("Ho finito")
End Sub

Andrea Simonassi
23-09-2002, 21:08
Usa l'oggetto Dictionary per immagazzinare le stringhe, dopo che avrai finito di immagazzinarle avrà già automaticamente eliminato i doppi.

evil80
23-09-2002, 21:12
scusa ma mi spiegheresti meglio cos'è,come si usa (propritetà,metodi ed eventi)

evil80
23-09-2002, 21:29
scusa ma di impostazioni predefinite carico dei dati nell'oggetto dictionary e se questi sono uguali lui li esclude ???

evil80
23-09-2002, 22:00
Originariamente inviato da Andrea Simonassi
Usa l'oggetto Dictionary per immagazzinare le stringhe, dopo che avrai finito di immagazzinarle avrà già automaticamente eliminato i doppi.

mi spieghi come posso eliminare automaticamente i doppioni ?

evil80
23-09-2002, 23:01
questo è il codice che ho scitto ma è troooopppo lento !!!!



Option Explicit
Dim selected As String

Private Sub CmdEsegui_Click()

'On Error Resume Next

Dim intFile As Integer
Dim ListaFile
Dim strTemp As String
Dim Contenuto
Dim lnC1 As Long
Dim lnc2 As Long
Dim intRitorno As Integer


Set ListaFile = CreateObject("Scripting.Dictionary")

'Assegna un numero valido per il file
intFile = FreeFile

'Apre il file
Open selected For Input As #intFile

'Legge l'intero contenuto del file e lo pone all'interno di un array riga per riga
lnC1 = 1
Do Until (EOF(intFile))

Line Input #intFile, strTemp
ListaFile.Add lnC1, strTemp
lnC1 = lnC1 + 1

Loop

'Chiude il file
Close #intFile


ProgressBar1.Min = 0
ProgressBar1.Max = ListaFile.Count
ProgressBar1.Value = 0

For lnC1 = 1 To ListaFile.Count - 1
For lnc2 = 1 To ListaFile.Count - 1
If (ListaFile.Item(lnC1) = ListaFile.Item(lnc2)) And (lnC1 <> lnc2) Then
ListaFile.Remove (lnc2)
End If
Next
If ProgressBar1.Value < ProgressBar1.Max Then
ProgressBar1.Value = ProgressBar1.Value + 1
End If
Next

intFile = FreeFile
Open selected For Output As #intFile

For lnC1 = 1 To ListaFile.Count - 1
Write #intFile, ListaFile.Item(lnC1)
Next

Close #intFile

intRitorno = MsgBox("Ho finito")
End Sub

Private Sub open_Click()
CommonDialogFile.ShowOpen
selected = CommonDialogFile.FileName
End Sub



Ti prego aiutami....

ciao

Andrea Simonassi
24-09-2002, 13:51
L'input consiste in linee di testo e basta?

Andrea Simonassi
24-09-2002, 18:53
Utilizzando un'albero binario non bilanciato (se ti metti anche a bilanciarlo rallenta troppo) ho elaborato un file da 11 MB (70000 righe) in 7 secondi su un celeron a 300 MHZ, usando solo l'interprete senza compilare, credo sia difficile fare di piu, se vuoi far di meglio usa il C.

Loading