Newsgroup: it.comp.lang.visual-basic
Titolo: Trovare un carattere specifico

Ciao Ragazzi ho un piccolo problema,
dovrei recuperara in una stringa dei campi, questa stringa usa  come
separatore il carattere pipe "|" come faccio a passare da pipe all'altro?
esempio
codice Articolo | descrizione | quantità
i campi sono purtroppo di lunghezza variabile...
quindi dovrei leggere carattere per carattere la riga ma come faccio????
Spero che qualcuno abbia la bontà di rispondermi cordialità Gianluca

Usa l'istruzione di VB INSTR, oppure (meno economica) SPLIT (quest'ultima ti
ritorna in un array tutti i campi dato un separatore.
----------------------------------------------------------------------
Stefano Minardi
Zetesis: 
zet...@mclink.it
----------------------------------------------------------------------

 quindi dovrei leggere carattere per carattere la riga ma come faccio????
Quella che segue è una funzione che effettua il parsing di una
stringa e restituisce un array che contiene tutti i "campi"
contenuti nella stringa. Non fai altro che leggere un "record" e
passarlo alla funzione nel parametro lzParStr. L'array PPS_Parms()
ti ritorna dimensionato in base al numero dei "campi" trovati.
Il parametro PPS_Sep è il carattere separatore dei "campi".
Public Function ParseParameterStr(lzParStr As String, _
    PPS_Parms() As String_
    PPS_Sep As String) _
    As Boolean
Dim Counter As Integer
Dim InstrPos1 As Integer
Dim InstrPos2 As Integer
   Counter = 0
   If Len(lzParStr) = 0 Then
      ParseParameterStr = False
      Exit Function
   End If
   Do
      InstrPos1 = InStr(InstrPos2 + 1, lzParStr, PPS_Sep)
      If InstrPos1 > 0 Then
         ReDim Preserve PPS_Parms(Counter)
         PPS_Parms(Counter) = Mid$(lzParStr, InstrPos2 + 1, InstrPos1 - InstrPos2 - 1)
         InstrPos2 = InstrPos1
         Counter = Counter + 1
      Else
         'Ultimo parametro
         ReDim Preserve PPS_Parms(IIf(Counter > 0, Counter, 0))
         PPS_Parms(Counter) = Mid$(lzParStr, InstrPos2 + 1, Len(lzParStr) - InstrPos2)
         Exit Do
      End If
   Loop
   ParseParameterStr = True
End Function

 ti ritorna in un array tutti i campi dato un separatore.
Oppure, se non usi VB6:
Option Explicit
Public Sub Main( _
)
Dim i, l&, s$
  Debug.Print "*Begin*"
  For Each i In Split("a|b|c", "|")
    Debug.Print Chr$(34) & i & Chr$(34)
  Next
  Debug.Print "*End*"
  Stop
End Sub
Public Function Split( _
ByVal str1$, ByVal str2$ _
)
Dim l_Start&, l_Next&, l_Item&, v_Array()
  If UCase$(Left$(str1, Len(str2))) <> UCase$(str2) Then _
    Let str1 = str2 & str1
  If UCase$(Right$(str1, Len(str2))) <> UCase$(str2) Then _
    Let str1 = str1 & str2
  Let l_Start = 1 + Len(str2)
  Do
    Let l_Next = InStr(l_Start, str1, str2)
    If l_Next = 0 Then Exit Do
    ReDim Preserve v_Array(l_Item)
    Let v_Array(l_Item) _
      = Mid$(str1, l_Start, l_Next - l_Start)
    Let l_Start = l_Next + Len(str2)
    Let l_Item = l_Item + 1
  Loop
  Let Split = v_Array
End Function
--
Ciao.
Maurizio

 Public Function Split( _
[...]
O meglio, sulla falsariga della proposta di Jimi:
Option Explicit
Public Sub Main( _
)
Dim s$, a$(), i
  Let s$ = "abcdef|ghijk|lmn"
  Debug.Print "*Begin2*"
  If Split2(s$, "|", a$()) Then
    For Each i In a$
      Debug.Print Chr$(34) & i & Chr$(34)
    Next
  End If
  Debug.Print "*End2*"
End Sub
' Ritorna il numero dei "campi"
'
Public Function Split2&( _
ByVal str1$, ByVal str2$, ByRef str$() _
)
Dim l_Start&, l_Next&
  If UCase$(Left$(str1, Len(str2))) <> UCase$(str2) Then _
    Let str1 = str2 & str1
  If UCase$(Right$(str1, Len(str2))) <> UCase$(str2) Then _
    Let str1 = str1 & str2
  Let l_Start = 1 + Len(str2)
  Do
    Let l_Next = InStr(l_Start, str1, str2)
    If l_Next = 0 Then Exit Do
    ReDim Preserve str(Split2)
    Let str(Split2) _
      = Mid$(str1, l_Start, l_Next - l_Start)
    Let l_Start = l_Next + Len(str2)
    Let Split2 = Split2 + 1
  Loop
