estrazione senza valori ripetuti



  • estrazione senza valori ripetuti
    di vico25 (utente non iscritto) data: 17/07/2013 11:10:18

    Ciao a tutti,
    avrei bisogno di una mano per una funzione.
    Sotto c'è il codice di una funzione che permette di togliere le lettere ripetute da una stringa, ad esempio:
    avendo la stringa "aaaabbbbccccc" => la funzione restituisce la stringa "abc"

    ora mi servirebbe una cosa del tipo:
    avendo la stringa "TOTOTOBABABAGEGE" => la funzione restituisce la stringa "TOBAGE"
    avendo la stringa "TORTORTORBAOBAOBAOGERGER" => la funzione restituisce la stringa "TORBAOGER"

    quindi una funzione che mi elimini le ripetizioni di coppie, terzine, etc...

    Grazie a tutti per l'ascolto e la disponibilità
     
    Function EliminaDoppie (ByVal s As String) As String
    Dim i As Integer
    Dim k As Integer
    
    
    If Len(s) > 0 Then
      'inizializzazioni: sicuramente il primo carattere di s e' da inserire
      'nella stringa del risultato r
      r = Mid$(s, 1, 1)
      k = 1
    
      For i = 2 To Len(s)
         If Mid$(s, i, 1) <> Mid$(r, k, 1) Then
            r = r & Mid$(s, i, 1)
            k = k + 1
         End If
      Next i
    
      EliminaDoppie = r
    Else
       EliminaDoppie = ""
    End If
    
    End Function



  • di Vecchio Frac data: 17/07/2013 11:20:28

    Ecco, queste sono le sfide che mi piacciono ^_^





  • di Vecchio Frac data: 17/07/2013 11:22:22

    Nella stringa di partenza, le coppie, terzine, quartine eccetera ripetute sono sempre in sequenza , oppure le ripetizioni possono essere ovunque nel testo?
    Mi spiego:
    è sempre così: --> "TOTOTOBABABAGEGE"
    o può essere anche
    così ---> "TOTOTOBABABAGEGETOTOGEBAGEBATO"

    ?





  • di vico25 (utente non iscritto) data: 17/07/2013 11:29:07

    No, sono sempre in sequenza per fortuna!
    Certo sarebbe bello averne una che non è influenzata dall' 'ordine' in cui sono disposte, ma per il momento sarebbe già un ottimo risultato averne una così... :-D

    Credo che il nocciolo sia 'adattare' il
    For i = 2 To Len(s)
    in modo da dirgli di 'saltare' ogni 2,3,... caratteri, ma non riesco a capire come farlo :-P



  • di Vecchio Frac data: 17/07/2013 11:49:29

    Ci sto pensando... adesso però scappo a pranzo ;)
    Vediamo se qualcuno raccoglie la sfida e ci prova prima di me :P





  • di Vecchio Frac data: 17/07/2013 13:02:28

    Stavo pensando anche che il codice non sa, a priori, se deve scegliere coppi o terzine o quartine, ecc. Così per non generalizzarla troppo, e produrre risultati in fondo inutili, costruisco la mia Function in modo che sia tu a stabilire se vuoi caratteri singoli, coppie, terzine o altro, mediante il passaggio di un parametro ad hoc.
    Concordi con l'impostazione?





  • di Vecchio Frac data: 17/07/2013 13:27:41

    Allora in attesa che tu mi risponda ecco quello che ho prodotto.
    Niente di che, sia chiaro, ma i sembra che funzioni :)
    La Function accetta in ingresso il testo (ovviamente) e il numero di caratteri desiderato per ogni sequenza (accetta anche 1, nel qual caso restituisce una lista con i singoli caratteri della stringa, ma uno solo quindi senza ripetizioni). La Function restituisce una Collection che bisogna scorrere per la lista delle sequenza trovate. Ti ritorna Nothing se i parametri forniti non sono validi.

    Esempio di utilizzo:
    for each v in group_by("TOTOTOBABABACUCUCU", 2)
    msgbox v
    next

    restituisce in sequenza to, ba, cu.
    Naturalmente puoi assegnare a una collection il valore di group_by, eccoti un esempio più complesso e forse più utile:
    set c = group_by("tortorbarbargerger", 3)
    if c is nothing then exit sub
    for each v in c
    s = s & v & vbcrlf
    next
    msgbox "Le terzine univoche sono " & c.count & vbcrlf & s

     
    Option Explicit
    
    Function group_by(text As String, num_groups As Integer) As Collection
    Dim c As Collection, i As Integer, s As String
    
        Set c = New Collection
        
        If num_groups < 1 Or num_groups > Len(text)  2 Then
            Set group_by = Nothing
            Exit Function
        End If
        
        On Error Resume Next
        For i = 1 To Len(text) Step num_groups
            s = Mid(text, i, num_groups)
            c.Add s, (s)
        Next
        On Error GoTo 0
        
        Set group_by = c
    
    End Function






  • di vico25 (utente non iscritto) data: 17/07/2013 15:18:11

    Ciao,
    scusami, ma al lavoro sono sempre incasinato su 3000 cose :-P

    Esatto, una funzione del tipo
    =nomefunzione('stringa con coppie/terzine/... ripetute','numero che idendifica se coppie, terzine,...')
    es.
    =nomefunzione("TOTOTOBABABACUCUCU",2)
    rilasciando la stringa "TOBACU"

    Ho provato ad incollarmi al volo il codice in excel e ad applicare la formula su una stringa presente in una cella, ma mi dà #VALORE!
    Cmq appena ho un attimo di respiro la studio meglio, è da modificare?

    Thanks



  • di Vecchio Frac data: 17/07/2013 15:34:24

    Certo, non può funzionare così.
    La function restituisce una Collection e la puoi manipolare solo da codice, nel modo che ti ho illustrato nel mio post.
    Se preferisci una funzione che restituisca una matrice (per esempio) la devo rivedere.
    Forse preferiresti il risultato anche così: una stringa unica con trattini a separare gli elementi "TO-BA-CU".





  • di vico25 (utente non iscritto) data: 17/07/2013 15:47:01

    Si diciamo che l'ideale sarebbe che potesse essere fruibile come una qualsiasi funzione...
    in modo da poter selezionare la stringa dal foglio excel, come se fosse applicassi un "stringa.estrai" diciamo
    non so se ho reso l'idea...

    Cmq appena esco dal tunnel di questa giornata mi guardo bene il codice che mi hai passato, a dire il vero ho solo fatto un copia incolla sul modulo e basta :-P

    Grazie ancora



  • di Vecchio Frac data: 17/07/2013 15:53:40

    Allora facciamo così.
    Aspetto che tu "esca dal tunnel" ^_^ e che ti veda il codice proposto, poi aspetto tue indicazioni su come procedere (magari nel frattempo elabori altre idee).