Newsgroup: it.comp.lang.visual-basic
Titolo: [?] replace

per la prima volta ho usato un goto non per la gestione errori:
    While Not EOF(fNumIn)
        Line Input #fNumIn, sIn
        If chkTrimDouble.Value = 1 Then
srch_repl:
            If InStr(sIn, "  ") > 0 Then
                sIn = Replace(sIn, Chr$(32) & Chr$(32), Chr$(32))
                GoTo srch_repl
            End If
        End If
la guida dice che se non si specifica quante occorrenze, replace le
sostituisce tutte.
pero' la sola riga sin=replace ecc. con una stringa come
          30/05/2000  18:56                   58 sms.txt          |<--
finisce qui
produce questo risultato:
     30/05/2000 18:56          58 sms.txt     |<-- finisce qui
c'e' un modo piu' aggraziato ?
grazie, a.

 c'e' un modo piu' aggraziato ?
L'ideale sarebbe farsi una replace ricorsiva, ma la si può
simulare facilmente (anche se in modo non molto efficiente)
così:
*************
     While Not EOF(fNumIn)
         Line Input #fNumIn, sIn
         If chkTrimDouble.Value = 1 Then
dim sInOld As String
do while sInOld <>sIn
sInOld = sIn
                 sIn = Replace(sIn, Chr$(32) & Chr$(32), Chr$(32))
Loop
         End If
*************
P.S.: non c'è una costante vbSpace, al posto di Chr$(32) ?
P.S.2: Non l'ho provata, magari era meglio con un Until
o con If sIn = sInOld then exit do. Comunque dovrebbe andare.
XBox: beh, questa stupidaggine ci voleva, prima che la mettesse
qualcun'altro. ;-)
Bye, G.

 per la prima volta ho usato un goto non per la gestione errori:
Non ho ben capito cosa volevi ottenere.
Un'eliminazione di tutti i "blocchi" di spazi con spazi singoli?
Allora bastava
' Non si usa il GoTo qui :) srch_repl:
             Do While InStr(sIn, "  ") > 0
                 sIn = Replace(sIn, "  ", " ") ' usiamo le costanti
' Ho detto di no! GoTo srch_repl
             Loop
Ciao

 c'e' un modo piu' aggraziato ?
Private Function TogliSpaziDoppi(ByVal sStringa As String) As String
   Dim lLunghezzaStringa As Long
   lLunghezzaStringa = Len(sStringa)
   sStringa = Replace(sStringa, "  ", " ")
   If lLunghezzaStringa > Len(sStringa) Then
      TogliSpaziDoppi = TogliSpaziDoppi(sStringa)
   Else
      TogliSpaziDoppi = sStringa
   End If
End Function
Per togliere anche i gli spazi all'inizio e alla fine, chiamala cosě:
Dim sStringa As String
sStringa = "          30/05/2000  18:56                   58 sms.txt
"
Debug.Print Trim$(TogliSpaziDoppi(sStringa))
Ciao
*Roby*
P.S.
Se non ti piace la soluzione ricorsiva, e non ti piacciono neppure quelle di
Zanna e Paperino, ce ne sarebbe un'altra che sfrutta la funzione Split e due
loop uno dentro l'altro. Perň questa soluzione č lasciata come esercizio per
lo studente. ;-)

              Loop
avevo provato esattamente questo codice, anche con while/wend. ma ho dovuto
uccidere due volte vb causa loop. mo' (appena acquisto un po' di lucidita'
:) provo anche il pap's code.
intanto grazie a tutti e due
a.

 uccidere due volte vb causa loop. mo'
ctrl+break

 intanto grazie a tutti e due
Prego da tutti e tre. ;-)
Ciao
*Roby*

 ctrl+break
grazie a tutti e quattro :)
roby, la ricorsione mi piace molto. al piu' dovro' fare
    ^break(^break(^break

Aggiungo anche la mia alle altre:
==========================================
Private Function TogliSpazi(ByVal Stringa As String) As String
Dim I As Integer
    Do
        I = InStr(Stringa, "  ")
        If  I > 0 Then
            Stringa = Left$(Stringa, I) + Trim$(Mid$(Stringa, I))
        End If
    Loop Until I = 0
    TogliSpazi = Stringa
End Function
==========================================
 ciao
roberto

 P.S.: non c'è una costante vbSpace, al posto di Chr$(32) ?
C'è la funzione Space(n) che restituisce n spazi.
Che altro vuoi ?... :-)))
--
Er Roscio.

> "javalab" [...]:

    Replace( _
        Replace( _
            Replace(Trim$(s), " ", vbCr & vbLf) _
          , vbLf & vbCr _
          , "") _
      , vbCr & vbLf _
      , " ")
--
Ciao.
Maurizio
--------
?SPQR(C)
 X
--------

 Che altro vuoi ?... :-)))
un tuca-tuca,no?
l'idea era di toglierne, non di metterne :>

       , " ")
in questo caso l'idea era di togliere doppi spazi, non di aggirarsi sui
cr/lf. pero' mi fai venire in mente che in effetti replace la si dovrebbe
poter usare ricorsivamente. provo a mixare le vostre idee.
se non sentite niente entro un paio di giorni, chiamate l'antiloop.
j(j(j(j(j(j(j(j(j(j(j(j(j))))))))))))

 provo a mixare le vostre idee.
Nulla di nuovo, ma forse ... sempre valida:
Function CAMBIA_STRINGA(stringa_totale, stringa_vecchia, stringa_nuova,
Optional parametri = 0)
'   parametri   2^0 Cambia tutte le occorrenze
'                   di stringa_vecchia in stringa_nuova
'                   Se Off cambia solo la prima stringa_vecchia trovata
'               2^1 Considera maiuscolo/minuscolo nella ricerca della
stringa vecchia
    ncar = "CAMBIA_STRINGA"
    stringa_finale = stringa_totale
    crt_inizio = 1
    Do
        If (parametri And 2 ^ 1) Then
'               Considera maiuscolo/minuscolo
            comodo = InStr(crt_inizio, stringa_finale, stringa_vecchia)
        Else
'               Ignora maiuscolo/minuscolo
            comodo = InStr(crt_inizio, UCase(stringa_finale),
UCase(stringa_vecchia))
        End If
        If comodo = 0 Then Exit Do
        If comodo = 1 Then
            stringa_finale = stringa_nuova & Mid(stringa_finale,
Len(stringa_vecchia) + 1)
        Else
            stringa_finale = Left(stringa_finale, comodo - 1) &
stringa_nuova & Mid(stringa_finale, comodo + Len(stringa_vecchia))
        End If
        If (parametri And 2 ^ 0) = 0 Then Exit Do
        crt_inizio = comodo + Len(stringa_nuova)
    Loop
    CAMBIA_STRINGA = stringa_finale
End Function

 se non sentite niente entro un paio di giorni, chiamate l'antiloop.
    Prova a farlo girare. ;)


 ha scritto
prima di provare la ricorsione, ho riprovato il tuo consiglio, perche' anche
a me era venuto spontaneo.
2 txt multiline e 2 command
Option Explicit
Const SPAC = " "
Const SPAC2 = "  "
Private Sub Command1_Click()
    Dim s As String
    Dim fNum As Long
    fNum = FreeFile
    Open App.Path & "\dir.txt" For Input As #fNum
    s = Input(LOF(fNum), fNum)
    Close #fNum
    Text1 = s
    While InStr(s, SPAC2) > 0
        s = Replace(s, SPAC2, SPAC)
    Wend
    Text2 = s
End Sub
Private Sub Command2_Click()
    Dim s As String
    Dim fNum As Long
    fNum = FreeFile
    Open App.Path & "\dir.txt" For Input As #fNum
    s = Input(LOF(fNum), fNum)
    Close #fNum
    Text1 = s
    While InStr(s, Chr$(32)) > 0
        s = Replace(s, Chr$(32) & Chr$(32), Chr$(32))
    Wend
    Text2 = s
End Sub
cmd2 entra in loop, cmd1 va che e' una bellezza.
qualcuno mi spiega il marchingegno per favore ?
ciao, a.

 qualcuno mi spiega il marchingegno per favore ?
Ho provato il tuo primo esempio con una stringa compilata a manina e tutto
funziona.
Bisognerebbe avere l'intero contenuto del tuo dit.txt
Sarà mica una questione di versioni e qualche buco nella tua Replace?
Io ho VB6 SP5

     While InStr(s, Chr$(32) & Chr$(32)) > 0


 ha scritto nel messaggio
news:ro%L8.15541$86.3...@twister1.libero.it...

Ebbravo Franco. Io avevo inteso male (che fosse la prima a non andare)  ...
č venerdě.

 qualcuno mi spiega il marchingegno per favore ?
Forse perchè manca un Chr$(32) :)
P.S.: Cosa sono quei Text1 = ...????
Ciao

 Io ho VB6 SP5
vb6ent usa sp5

> "Maurizio Borrelli" [...]:


    Ho capito. Devo farlo girare io!...
    Option Explicit
    Sub main()
        Dim s As String
        s = "          30/05/2000  18:56                   58 sms.txt
"
        s = Replace(Trim$(s), Chr$(32), "><")
        Debug.Print s
        s = Replace(s, "<>", "")
        Debug.Print s
        s = Replace(s, "><", Chr$(32))
        Debug.Print s
    End Sub
    Output:
    30/05/2000><><18:56><><><><><><><><><><><><><><><><><><><58><sms.txt
    30/05/2000><18:56><58><sms.txt
    30/05/2000 18:56 58 sms.txt
    Nella stringa, pero', potrebbero essere presenti i caratteri "<" e ">".
Allora... vedi sopra.


 vb6ent usa sp5
Java, siamo vecchi e anche un po' ciechi e la scusa che "č stata una
settimana dura" non convince piů nemmeno noi ;-) Franco e Zanna devono
essere degli adolescenti con tutti i neuroni ancora goduriosamente
saltellanti.

 ha scritto

bravo andrea... facciamo che si stacca per un po' ?
ho solo un dubbio su cosa succedeva ieri.
nel post ho incollato questo codice:
            If InStr(sIn, "  ") > 0 Then
gli spazi direi siano due.
vabbe'
grazie, a.

 P.S.: Cosa sono quei Text1 = ...????
ehm, ogni tanto non scrivo la propr di default.
sto cambiando metodo, ma ogni tanto mi scappa...
maestro posso uscire ?
j.

     Ho capito. Devo farlo girare io!...
ammauri', gia' mi sto fustigando... non infierire.
ci metto un po' a capire...

 saltellanti.
anche il mio neurone saltella.
epilessia, probabilmente.
zanna lo so per certo, giovane si', ma non adolesce da un po'.
il sintetico franco non saprei. certo che e' come pannunzio del mondo:
"nelle riunioni non apriva mai bocca, ma alla fine tutti la pensavano come
lui".
j.