Newsgroup: it.comp.appl.access
Titolo: Dividere un testo

Ciao a tutti,
In un database ho due tabelle, la prima denominata FIL_EXE collegata ad un
file excel contenente i campi F1 e F2,
la seconda denominata ARC_NOR contenente i campi TIP_DOC, NUM_DOC, DAT_DOC e
OGG_DOC.
F1 = Risoluzione 319 del 04.10.02
F2 = oggetto:  Smarrimento di un timbro personalizzato tascabile n. 5246.
Vorrei ottenere il seguente risultato:
TIP_DOC = Risoluzione
NUM_DOC = 319
DAT_DOC = 04.10.02
OGG_DOC = Smarrimento di un timbro personalizzato tascabile n. 5246.
Che funzioni mi consigliate di studiare per ottenere questo risultato

> se usi vba, ci sono tante funzioni per manipolare stringhe e numeri; la
soluz. + semplice sarebbe dividere le colonne nel foglio excel equivalenti
ai campi della tabella.
Saluti

 ha scritto nel messaggio
news:%BVr9.47341$%M1.11...@twister2.libero.it...

Per suddividere le 2 stringhe dovrebbero bastarti queste funzioni
InStr, Mid$
e un ciclo
Do
    ........
Loop Until (ValInStr = 0)
dove ValInstr è il risultato della funzione InStr ....
Ti ho già detto troppo, Studia!!!
:-) Ciao, omnitow

> "Simone" news:%BVr9.47341$%
M1.11...@twister2.libero.it
:

        Function Split( _
            Expression As String _
          , [Delimiter] _
          , [Limit As Long = -1] _
          , [Compare As VbCompareMethod = vbBinaryCompare])
            Membro di VBA.Strings
            Split a string into an array
        Function Join( _
            SourceArray _
          , [Delimiter] _
          ) As String
            Membro di VBA.Strings
            Join array elements into a string
--
Ciao :-)
Maurizio
--------
?SPQR(C)
 X
--------

 wrote in message
aopaua$32r$1...@fe2.cs.interbusiness.it...

Grazie a tutti, vedrò di applicarmi
Ciao

 OGG_DOC = Smarrimento di un timbro personalizzato tascabile n. 5246.
Prova con:
Private Sub MioBottone_Click()
    Dim MioArray() As String
    F1 = "Risoluzione 319 del 04.10.02"
    F2 = "oggetto:  Smarrimento di un timbro personalizzato tascabile n. 5246."
    MioArray = Split(F1, " ")
    TIP_DOC = MioArray(0)
    NUM_DOC = MioArray(1)
    DAT_DOC = MioArray(3)
    MioArray = Split(F2, " ", 2)
    OGG_DOC = MioArray(1)
End Sub
Ciao. Claudio.

 Private Sub MioBottone_Click()
[...]
    Claudio!... Per una volta che uno vuole studiare gli togli anche la
soddisfazione?!... ;-))


 soddisfazione?!... ;-))
Questa volta hai ragione. Era così ben disposto...
Ma ho postato la soluzione perché ho riesumato una funzione che avevo
realizzato qualche tempo fa per estrarre un numero indeterminato di parole da
una frase, con la possibilità di impostare quanti delimitatori si voglia. Ho
sperato che con la split per qualche motivo non si riuscisse, in modo da dover
usare la mia, ma quando ho visto che si poteva senza problemi per la delusione
ho riportato le mie prove. ;.)
Ciao. Claudio.

 Era cosě ben disposto...
    Anche tu. :-)


     Anche tu. :-)
Già. Per rincarare la dose, provo a postare la funzione accennata un paio di
messaggi fa. Io la trovo estremamente generale per risolvere tutti i problemi
di estrazione parole da una stringa. Ovviamente sarebbero molto gradite le
critiche, del tipo 'Non funziona in questa situazione', 'Io la riscriverei con
sole due istruzioni in questo modo', 'c'è gia la funzione CiucciaStringa() che
fa tutto ciò e meglio', 'è la più utile funzione che abbia mai visto', 'non
serve a niente', e così via... così discorrendo.
Grazie a tutti per la collaborazione.
Ciao. Claudio
Public Function EstraiParole(ByVal Stringa As String, Optional DaParola As
Integer = 1, _
    Optional NumeroParole As Integer = 1, Optional Delimitatori As String = "
")
'
' Questa funzione serve per estrarre "NumeroParole" parole dalla stringa
"Stringa",
' partendo dalla parola "DaParola". Per parola si intende tutto ciò che nella
stringa
' viene separato facendo uso di un qualunque carattere contenuto in
"Delimitatori".
' Se si specifica 0 come "NumeroParole" si ottiene la frase dalla parola
"NumeroParola"
' fino alla fine.
' Accetta valori negativi per l'argomento "DaParola", con il significato "le
ultime
' n parole". Per esempio, DaParola=-3 significa dalla terzultima parola.
' Il primo carattere della stringa "Delimitatori" ha un significato
particolare: rappresenta
' il carattere che verrà usato per separare le parole nella stringa risultante.
'
' Esempi:
' EstraiParole("Questa, *è* una -frase-",2,2," ,*-") --> "è una"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-") --> "Questa è una frase"
' EstraiParole("Questa, *è* una -frase-",,0,"; ,*-") --> "Questa;è;una;frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*-") --> "una frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*") --> "una -frase-"
'
' Scritta da Claudio - Ultimo aggiornamento ottobre 2002
'
Dim ParolaArray() As String
For i = 1 To Len(Delimitatori)
    Stringa = Replace(Stringa, Mid(Delimitatori, i, 1), " ")
    Next i
Stringa = Trim(Stringa)
While InStr(Stringa, "  ")
    Stringa = Replace(Stringa, "  ", " ")
Wend
ParolaArray = Split(Stringa)
If DaParola < 0 Then DaParola = UBound(ParolaArray) + DaParola + 2
If DaParola <= 0 Then DaParola = 1
If DaParola > UBound(ParolaArray) + 1 Then _
    DaParola = UBound(ParolaArray) + 1
If NumeroParole = 0 Or DaParola + NumeroParole > UBound(ParolaArray) + 2 Then _
    NumeroParole = UBound(ParolaArray) - DaParola + 2
EstraiParole = ParolaArray(DaParola - 1)
For i = DaParola To DaParola + NumeroParole - 2
    EstraiParole = EstraiParole & Left(Delimitatori, 1) & ParolaArray(i)
    Next i
End Function

 Grazie a tutti per la collaborazione.
Funziona per a97?  Mi sembra di no 
Non lo fanno meglio ma sul sitocomune c'e' Token e Numtoken (per a97
funzionano)
Inoltre, non so se ho capito bene, cosa succede se "non" voglio lo
spazio
come delimitatore?
Se dovessi aver capito bene ti consiglio di usare, per la replace, il
primo delimitatore.
--
a.cara

 primo delimitatore.
Forse sono io che non ho capito. Ti dispiace farmi un esempio di che cosa non si riuscirebbe ad
ottenere?
Grazie ancora e ciao.
Claudio.

 ottenere?
Ok 
Stringa = "Stiamo cercando di capire se la funzione estraeparole e'
utile"
x=EstraeParole(stringa,2,1,"ia")   Cosa ottengo? "mo" o "mo cerc"?
Capisco che e' un "estraeparole" ma se estraesse "mo" mi sembrerebbe una
limitazione 
x=token(stringa,"ia",2) estrae "mo cerc"
Come suggerimento, secondo me, il parametro delimitatori sarebbe meglio
in
2' posizione
--
a.cara

 2' posizione
Ok. Mi hai convinto. Sebbene sia nata per estrarre parole tra caratteri strani, si può
fare in modo che funzioni anche in questi casi (spero di non essermene persi altri...). Ho
quindi pensato di modificarla come segue. Dovrei aver mantenuto tutte le funzionalità di
prima, ma aggiunto quello che tu dici. Grazie e ciao.
Public Function EstraiParole(ByVal Stringa As String, Optional DaParola As Integer = 1, _
    Optional NumeroParole As Integer = 1, Optional Delimitatori As String = " ")
'
' Questa funzione serve per estrarre "NumeroParole" parole dalla stringa "Stringa",
' partendo dalla parola "DaParola". Per parola si intende tutto ciò che nella stringa
' viene separato facendo uso di un qualunque carattere contenuto in "Delimitatori".
' Se si specifica 0 come "NumeroParole" si ottiene la frase dalla parola "NumeroParola"
' fino alla fine.
' Accetta valori negativi per l'argomento "DaParola", con il significato "le ultime
' n parole". Per esempio, DaParola=-3 significa dalla terzultima parola.
' Il primo carattere della stringa "Delimitatori" ha un significato particolare:
rappresenta
' il carattere che verrà usato per separare le parole nella stringa risultante.
'
' Esempi:
' EstraiParole("Questa, *è* una -frase-",2,2," ,*-") --> "è una"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-") --> "Questa è una frase"
' EstraiParole("Questa, *è* una -frase-",,0,"; ,*-") --> "Questa;è;una;frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*-") --> "una frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*") --> "una -frase-"
'
' Scritta da Claudio - Ultimo aggiornamento ottobre 2002
'
Dim ParolaArray() As String
For i = 2 To Len(Delimitatori)
    Stringa = Replace(Stringa, Mid(Delimitatori, i, 1), Left(Delimitatori, 1))
    Next i
While InStr(Stringa, String(2, Left(Delimitatori, 1)))
    Stringa = Replace(Stringa, String(2, Left(Delimitatori, 1)), Left(Delimitatori, 1))
Wend
If Len(Stringa) < 2 Then
    EstraiParole = Stringa
    Exit Function
End If
If Left(Stringa, 1) = Left(Delimitatori, 1) Then Stringa = Mid(Stringa, 2)
If Right(Stringa, 1) = Left(Delimitatori, 1) Then Stringa = Left(Stringa, Len(Stringa) -
1)
ParolaArray = Split(Stringa, Left(Delimitatori, 1))
If DaParola < 0 Then DaParola = UBound(ParolaArray) + DaParola + 2
If DaParola <= 0 Then DaParola = 1
If DaParola > UBound(ParolaArray) + 1 Then _
    DaParola = UBound(ParolaArray) + 1
If NumeroParole = 0 Or DaParola + NumeroParole > UBound(ParolaArray) + 2 Then _
    NumeroParole = UBound(ParolaArray) - DaParola + 2
EstraiParole = ParolaArray(DaParola - 1)
For i = DaParola To DaParola + NumeroParole - 2
    EstraiParole = EstraiParole & Left(Delimitatori, 1) & ParolaArray(i)
    Next i
End Function
Ciao. Claudio.

 End Function
secondo me questo, anche nella versione precedente, falsifica la stringa, mi
spiego,
se restituisci + parole le trovi separate da un delimitatore che non era
quello
originale, forse e' meglio lo spazio ;<)
--
a.cara

 originale, forse e' meglio lo spazio ;<)
Ok. Dopo aver mangiato, dopo aver bevuto :-) si ragiona meglio. Eccomi qui con un'altra
versione. Questa volta confido nel fatto che possa superare i precedenti dubbi. Ho
aggiunto la possibilità di specificare un "Separatore" indipendente, che separerà le
"parole" in output. Fammi sapere che ne pensi. Mi spiace solo che la cosa interessi (?)
solo te... Grazie e ciao.
Public Function EstraiParole(ByVal Stringa As String, Optional DaParola As Integer = 1, _
    Optional NumeroParole As Integer = 1, Optional Delimitatori As String = " ", _
    Optional Separatore As String = " ")
'
' Questa funzione serve per estrarre "NumeroParole" parole dalla stringa "Stringa",
' partendo dalla parola "DaParola". Per parola si intende tutto ciò che nella stringa
' viene separato facendo uso di un qualunque carattere contenuto in "Delimitatori".
' Se si specifica 0 come "NumeroParole" si ottiene la frase dalla parola "NumeroParola"
' fino alla fine.
' Accetta valori negativi per l'argomento "DaParola", con il significato "le ultime
' n parole". Per esempio, DaParola=-3 significa dalla terzultima parola.
' Specificando una stringa in "Separatore", è possibile impostare la stringa che
' dividerà le "parole" nell'output finale.
'
' Esempi:
' EstraiParole("Questa, *è* una -frase-",2,2," ,*-") --> "è una"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-") --> "Questa è una frase"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-",";") --> "Questa;è;una;frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*-") --> "una frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*") --> "una -frase-"
'
' Scritta da Claudio - Ultimo aggiornamento ottobre 2002
'
Dim ParolaArray() As String
For i = 1 To Len(Delimitatori)
    Stringa = Replace(Stringa, Mid(Delimitatori, i, 1), Chr(0))
Next i
While InStr(Stringa, String(2, Chr(0)))
    Stringa = Replace(Stringa, String(2, Chr(0)), Chr(0))
Wend
If Len(Stringa) < 2 Then
    EstraiParole = Stringa
    Exit Function
End If
If Left(Stringa, 1) = Chr(0) Then Stringa = Mid(Stringa, 2)
If Right(Stringa, 1) = Chr(0) Then Stringa = Left(Stringa, Len(Stringa) - 1)
ParolaArray = Split(Stringa, Chr(0))
If DaParola < 0 Then DaParola = UBound(ParolaArray) + DaParola + 2
If DaParola <= 0 Then DaParola = 1
If DaParola > UBound(ParolaArray) + 1 Then _
    DaParola = UBound(ParolaArray) + 1
If NumeroParole = 0 Or DaParola + NumeroParole > UBound(ParolaArray) + 2 Then _
    NumeroParole = UBound(ParolaArray) - DaParola + 2
EstraiParole = ParolaArray(DaParola - 1)
For i = DaParola To DaParola + NumeroParole - 2
    EstraiParole = EstraiParole & Separatore & ParolaArray(i)
Next i
End Function

 Public Function EstraiParole(ByVal Stringa As String, Optional DaParola As
[...]
    Ho riscritto il tutto a modo mio, mantenendo pero' inalterata l'essenza.
Ora dovrebbe essere piu' veloce. Fammi sapere se ho interpretato male
qualcosa.
    Sembra che la tua funzione faccia cio' che dichiara di voler fare.
    L'unica cosa che mi lascia perplesso e' perche' non ti rivolgi al mondo
delle "espressioni regolari" (non domandarne a me, pero') invece di
"accontentarti" di soluzioni parziali.
' ------------------------------------------------------------
  Option Explicit
' ------------------------------------------------------------
' ************************************************************
  Private Sub Main()
' ------------------------------------------------------------
  On Error GoTo errh
' ------------------------------------------------------------
  Dim s As String
' ------------------------------------------------------------
  s = "Questa, *è* una -frase-"
  Debug.Print "«"; EstraiParole(s, 2, 2, " ,*-"); "»"
  Debug.Print "«"; EstraiParole(s, , 0, " ,*-"); "»"
  Debug.Print "«"; EstraiParole(s, , 0, " ,*-", ";"); "»"
  Debug.Print "«"; EstraiParole(s, -2, 0, " ,*-"); "»"
  Debug.Print "«"; EstraiParole(s, -2, 0, " ,*"); "»"
  ' "è una"
  ' "Questa è una frase"
  ' "Questa;è;una;frase"
  ' "una frase"
  ' "una -frase-"
ext:
  Exit Sub
errh:
  With Err
    MsgBox .Description, vbCritical, "ERR#" & .Number
  End With
  Resume ext
  End Sub
' ************************************************************
' ************************************************************
  Public Function EstraiParole( _
    ByVal Stringa As String _
  , Optional ByVal DaParola As Long = 1 _
  , Optional ByVal NumeroParole As Long = 1 _
  , Optional ByVal Delimitatori As String = " " _
  , Optional ByVal Separatore As String = " " _
  ) As String
' ------------------------------------------------------------
' Questa funzione serve per estrarre "NumeroParole" parole
' dalla stringa "Stringa", partendo dalla parola "DaParola".
' Per parola si intende tutto ciò che nella stringa
' viene separato facendo uso di un qualunque carattere
' contenuto in "Delimitatori".
' Se si specifica 0 come "NumeroParole" si ottiene la frase
' dalla parola "NumeroParola" fino alla fine.
' Accetta valori negativi per l'argomento "DaParola", con il
' significato "le ultime n parole".
' Per esempio, DaParola=-3 significa dalla terzultima parola.
' Specificando una stringa in "Separatore", è possibile
' impostare la stringa che dividerà le "parole" nell'output
' finale.
' ------------------------------------------------------------
' Esempi:
' EstraiParole("Questa, *è* una -frase-", 2, 2, " ,*-")
'   --> "è una"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-")
'   --> "Questa è una frase"
' EstraiParole("Questa, *è* una -frase-",,0," ,*-",";")
'   --> "Questa;è;una;frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*-")
'   --> "una frase"
' EstraiParole("Questa, *è* una -frase-",-2,0," ,*")
'   --> "una -frase-"
' ------------------------------------------------------------
' Scritta da Claudio - Ultimo aggiornamento ottobre 2002
' ------------------------------------------------------------
  Dim ParolaArray() As String
  Dim i             As Long
  Dim vbNullChar2   As String
' ------------------------------------------------------------
  For i = 1 To Len(Delimitatori)
    Stringa _
      = Replace( _
            Stringa _
          , Mid$(Delimitatori, i, 1) _
          , vbNullChar)
  Next i
  vbNullChar2 = vbNullChar & vbNullChar
  While InStr(Stringa, vbNullChar2)
    Stringa = Replace(Stringa, vbNullChar2, vbNullChar)
  Wend
  If (Len(Stringa) < 2) Then
    EstraiParole = Stringa
    Exit Function
  End If
  If (Left$(Stringa, 1) = vbNullChar) Then
    Stringa = Mid$(Stringa, 2)
  End If
  If (Right$(Stringa, 1) = vbNullChar) Then
    Stringa = Left$(Stringa, Len(Stringa) - 1)
  End If
  ParolaArray = Split(Stringa, vbNullChar)
  If (DaParola < 0) Then
    DaParola = UBound(ParolaArray) + DaParola + 2
  End If
  If (DaParola <= 0) Then
    DaParola = 1
  End If
  If (DaParola > (UBound(ParolaArray) + 1)) Then
    DaParola = UBound(ParolaArray) + 1
  End If
  If ( _
       (NumeroParole = 0) _
       Or _
       ((DaParola + NumeroParole) > (UBound(ParolaArray) + 2)) _
  ) Then
    NumeroParole = UBound(ParolaArray) - DaParola + 2
  End If
  EstraiParole = ParolaArray(DaParola - 1)
  For i = DaParola To DaParola + NumeroParole - 2
    EstraiParole = EstraiParole & Separatore & ParolaArray(i)
  Next i
End Function
--


 "accontentarti" di soluzioni parziali.
Beh, inserire la gestione delle espressioni regolari comporterebbe tutto un altro impegno.
In fondo credo che andrebbe oltre a quello che mi ero prefisso quando avevo deciso di
scrivere questa funzione. Il tutto scaturì dal fatto che molta gente mi chiedeva come
separare parole in una frase. Tipicamente la necessità sorgeva quando si importavano in
Excel dati provenienti da altri ambienti (come indirizzari e cose del genere), e in Excel
risultava un problema separare dei campi che non avessero specifici delimitatori tra essi.
Spero che possa servire anche a qualcun altro. Con i pungoli di Cara fa già molto di più
di quando è nata.
Ciao. Claudio.

 ;-)
    Il 19% di 1 o di 1.000.000 e' sempre il 19%. Buttalo via!...
    Poi in giro dicono che le applicazioni scritte in Access sono lente! La
lentezza e' la risultante di tante piccole o piccolissime trascuratezze.


solo te... Grazie e ciao.
Qualcuno legge in silenzio ....

'   --> "Questa è una frase"
Correggerei la descrizione:
Se si specifica 0 come "NumeroParole" si ottiene l'insieme delle
parole dalla parola "NumeroParola" fino alla fine.
(la frase non  è definita. Dovrebbe forse avere anche i
delimitatori...)

 delimitatori...)
    Capito, Claudio?


 ha scritto nel messaggio
news:6rkbru4ac5e49bpvv...@4ax.com...

Daccordissimo! L'ho già fatto nella mia versione, ma non invio nuovamente tutta la
funzione. Non vorrei mi mandassero un conto per lo spazio disco occupato.
Merci.
Ciao. Claudio.

 ha scritto nel messaggio
news:sdkbru857mmps3rgv...@4ax.com...

Che peccato...