Newsgroup: it.comp.lang.visual-basic
Titolo: Controllo duplicati.

Un saluto a tutta la ML
Sono un principiante e vorrei sapere come posso fare a cantrollare se su un
file di testo
ci sono dei dati duplicati.
es.:
12   rossi mario        via dante 18       genova      123456789
15  biancxhi giorgio  via puccini 17     livorno       987645123
16  verdi luigi           via rossini 15      milano        584645856
45  neri ottavio        via  parini  78      bari            123456789
e cosi via,  vorrei in pratica inserire un controllo sui numeri a destra in
modo
da avvisare quando i dati sono duplicati come nel caso del 1 e del 4
nominativo.
il formato del file è txt, ha un preciso tracciato record,
inoltre per me l'ideale sarebbe che tutte le stringhe duplicate
vengano riportate su un altro file txt e che alla fine tutto venga
segnalato in un msgbox.
grazie e scusate
Roberto.

*Roberto* ha scritto:

Non provato:
c_input=Freefile
open "C:\cartella\file_da_leggere" For Input Shared As #c_input
c_output=Frefile
open "C:\cartella\file_da_scrivere" For Output As #c_output
Dim numeri (0 To 0)
n_riga=0
Do
    If EOF(c_input) Then Exit Do
    Line Input #c_input, riga
    n_riga=n_riga+1
    numero=Val(Mid(riga,50)        '50 da adeguare=primo byte inizio numero
nella riga
    Do
        For n=1 to UBound(numeri)
            If numeri(n)=numero Then
                Print #c_output, "Numero " & numero & " duplicato sulla riga
" & n_riga & " = " & riga
                Exit Do
            End If
        Next n
        Redim Preserve numeri(0 to UBound(numeri)+1)
        numeri(UBound(numeri))=numero
        Exit Do
    Loop
Loop
Close c_input
Close c_output

 Non provato:
(snip)
accipicchia, speravo che qualcuno postasse il codice per utilizzare un file di
testo come fonte dati.
Mi sembrava fosse una cosa possibile....
Poi fare una query di ricerca duplicati....
Veniva anche elegante. Andrò a vedere se trovo qualcosa in giro.
--
Salutoni
Sergio

 testo come fonte dati.
A parte che, se lasci fuori ADO (e pure SQL), non ci sarebbe alcun problema,
sbaglio o oggi avete deciso di toronare? Ohi, non č ancora venerdě...

 venerdì...
no, non stavo toronando.
ho sentito parlare alcune volte della possibilità di utilizzare i file di testo
come fonte dati, e mi sembrava che il problema proposto da roberto fosse adatto
a questa tecnica. personalmente ho sempre risolto problemi simili in un modo
paragonabile a quello da te proposto, ma non si finisce mai di imparare
--
Salutoni
Sergio

 testo come fonte dati.
io l'ho fatto, se vuoi ti mando il modulo
ciaociao

 naturalmente il TI è da leggere VI
Curiosità:
Quale sarebbe la destinazione della fonte dati?
Intendo dire, dove lo passi il "recordset" ottenuto al file di testo?
Excel/Access/Griglie con separatori?

 Semplicemente un recordset!
e vabbuò!
posta il modulo, dai :-)
--
Salutoni
Sergio

 posta il modulo, dai :-)
e vabbuò, cuccatevillo!
(Ho messo tutto il codice, quindi c'è anche la parte che legge dal database
le specifiche del file, in modo da poter definire i campi come te pare)
Public xr_files As ADODB.recordset
Private Sub Class_GetDataMember(DataMember As String, Data As Object)
Set Data = xr_files
End Sub
Private Sub Class_Initialize()
Dim intPos As Integer
Dim NumFile As Integer
Dim strRow As String
Dim strField As String
Dim Separatore As String
Dim fld As ADODB.Field
Dim xr_dettaglio As recordset
Dim xr_tipo_file As recordset
Dim xb As database            'Per accedere alla tabella di configurazione
dei file
   On Error GoTo Init_Error
   NumFile = FreeFile
   Set xr_files = New ADODB.recordset
   Set xb = OpenDatabase(App.Path & MDB_NAME)
   Set xr_tipo_file = xb.OpenRecordset("SELECT * FROM files WHERE attivo =
true", dbOpenSnapshot)
   If xr_tipo_file.RecordCount > 0 Then
      xr_tipo_file.MoveLast
      'Se c'è più di un formato attivo non va bene...
      If xr_tipo_file.RecordCount > 1 Then
         MsgBox "Esiste più di un formato di file attivo." & vbCr & _
                "Impostare un solo formato prima di proseguire!", _
                vbExclamation, "Verifica formato del file"
         Exit Sub
      Else
         s_sql = "SELECT * FROM dettaglio_files " & _
                 "WHERE idfile = " & xr_tipo_file!idfile & " ORDER BY
idcampo"
         Set xr_dettaglio = xb.OpenRecordset(s_sql, dbOpenSnapshot)
         If xr_dettaglio.RecordCount = 0 Then
            MsgBox "Il formato di file attivo non ha nessun campo
specificato. " & vbCr & _
                   "Impostare i campi prima di proseguire!", _
                   vbExclamation, "Verifica formato del files"
            Exit Sub
         End If
      End If
   Else  'Se non c'è nessuna impostazione esco subito senza messaggi
      Set xb = Nothing
      Set xr_files = Nothing
      Set xr_tipo_file = Nothing
      Exit Sub
   End If
   'Se arrivo qui ho il formato del file (teoricamente corretto)
   'quindi devo creare tutti i fields del recordset in base alle
impostazioni
   Separatore = xr_tipo_file!Separatore
   With xr_files
      Do While Not xr_dettaglio.EOF
         'Imposta CustomerID come chiave primaria.
         .fields.Append xr_dettaglio!nome_campo, adChar,
xr_dettaglio!dimensione, adFldUpdatable
         xr_dettaglio.MoveNext
      Loop
      'Utilizza un cursore di tipo Keyset per consentire l'aggiornamento dei
record.
      .CursorType = adOpenKeyset
      .LockType = adLockOptimistic
      .Open
   End With
   Open xr_tipo_file!path_file For Input As #NumFile
   Do Until EOF(NumFile)
      Line Input #NumFile, strRow
      With xr_files
         .addnew
         For Each fld In .fields
            'File a campi delimitati
            If xr_tipo_file!Tipo = 2 Then
               ' Se individua il delimitatore tabulazione, il testo del
               ' campo sarà a sinistra del delimitatore.
               If InStr(strRow, Separatore) <> 0 Then
                  ' Esegue uno spostamento sul delimitatore.
                  intPos = InStr(strRow, Separatore)
                  ' Assegna il testo del campo alla variabile strField.
                  strField = Left(strRow, intPos - 1)
               Else
                  ' Se non individua un delimitatore tabulazione, il testo
                  ' del campo sarà l'ultimo campo della riga.
                  strField = strRow
               End If
               ' Elimina le virgolette doppie. (se ci sono)
               If Left(strField, 1) = Chr(34) Then
                  strField = Left(strField, Len(strField) - 1)
                  strField = Right(strField, Len(strField) - 1)
               End If
            Else
               'Campi a lunghezza fissa
               strField = Mid(strRow, 1, fld.DefinedSize)
               intPos = fld.DefinedSize
            End If
            fld.Value = strField
            ' Elimina dalla riga di testo il testo del valore del campo
            strRow = Right(strRow, Len(strRow) - intPos)
            intPos = 0
         Next
         .Update
         .MoveFirst
      End With
   Loop
   Close #NumFile
Init_quit:
   Exit Sub
Init_Error:
   MsgBox err.Number & " - " & err.Description & vbCr & vbCr & _
          "Il file di importazione non verrà inizializzato!" & vbCr & _
          "Verificare i parametri prima di continuare.", _
          vbCritical, "DataFiles - Initialize"
   Resume Init_quit
End Sub

 ha scritto nel messaggio
news:b5a12r$27eaqf$1...@ID-174464.news.dfncis.de...


 
Quello che uso io mi pare piu' semplice ...
     schemaPath = "percorso al file schema.ini"
     fileName = "nome del file da cui leggere i dati"
     'need to use the Text ISAM driver to read file.
     strCnInput = "Driver={Microsoft Text Driver (*.txt; *.csv)};" & _
             "DBQ=" & schemaPath & ";" & _
             "DefaultDir=" & schemaPath & ";" & _
             "Uid=Admin;Pwd=;"
     Set adoCnInput = New ADODB.Connection
     adoCnInput.Open strCnInput
     Set adoRsInput = New ADODB.Recordset
     'Open input table - i.e. Text import file.
     adoRsInput.Open "SELECT * FROM [" & Replace(fileName, ".", "#", 1, 
Len(fileName)) & "]", _
             adoCnInput, adOpenStatic, adLockReadOnly, adCmdText
E' in sola lettura, ma suppongo che funzioni anche in scrittura 
modificando opportunamente i parametri di apertura del recordset.
Schema.ini e' fatto cosi':
[cdc.TXT]
ColNameHeader=false
Format=Delimited(|)
CharacterSet=ANSI
Col1=CdC text
Col2=Def text
Col3=Resp text
Col4=Rep text
Col5=c5 text
Col6=C6 text
Col7=C7 text
Col8=C8 text
Col9=C9 text
Col10=C10 text
Col11=C11 text
Col12=C12 text
Col13=C13 text
Col14=C14 text
Col15=C15 text
Su MSDN e' indicato il formato del file ...
ciao
	maxx
-- 
NOSPAM: Rimuovere i trattini dallo username!
Cut hyphens from my username!

 le specifiche del file, in modo da poter definire i campi come te pare)
[CUTTONE]
Ora, non è che mi aspettassi un'ovazione, ma almeno un "bello" o "brutto" o
"che ca..o hai scritto!" o "ok, proverò".......:-(

 "brutto" o "che ca..o hai scritto!" o "ok, proverò".......:-(
sinceramente stavo provando. avevo in mente un'altra strada, però cerca di non
avere fretta :-)
--
Salutoni
Sergio

Il 3/19/2003 5:09 PM, Marg scrisse:

Bello!
Ma a cosa serve? E poi e' molto complicato ...
Ci vuole qualche minuto per studiarselo.


 maxx
Cacchio! non sapevo si potesse fare cosě.......sbattimento inutile! (il
mio) :-(
Pazienza, ora provo grazie!
ciaociao

 avere fretta :-)
Chiedo umilmente perdono.........č che in ufficio mi stanno facendo girare
le .....
scusate ancora
ciaociao

 Ci vuole qualche minuto per studiarselo.
scusami anche tu, hai ragione!
ciaociao

Il 3/19/2003 5:15 PM, Marg scrisse:

Non ti preoccupare, stavo scherzando, ma ho dimenticato di aggiungere 
alla fine un bello smile :-)
E poi immagino come tu ti debba sentire dopo aver scoperto che cio' che 
hai scritto in 100 righe poteva essere scritto in 5! ;-)


 hai scritto in 100 righe poteva essere scritto in 5! ;-)
Che fai, infierisci?!?!
;-)))


 "che ca..o hai scritto!" o "ok, proverò".......:-(
Marg, mi ero sganciato. L'ho visto ora.
Non è male, anche se le fasi di cui si compone sono piuttosto banali:
Struttura del database (in DAO), recupero dei dati dal file di testo e
aggiunta di record con gli stessi. Nulla da togliere al tuo lavoro, ma è
quello che si fa normalmente. La parte interessante, certamente, è quella
che recupera dati dal file di testo.

>     numero=Val(Mid(riga,50))        '50 da adeguare=primo byte inizio
numero

 che recupera dati dal file di testo.
ok, ciao e grazie