Newsgroup: it.comp.lang.visual-basic
Titolo: selezionare parte (a lungh. variabile) di stringa

Salve,
sono uno newbie di VB, prima di postare cerco sempre nel NG ma
stavolta devo "gettare la spugna":
ho una stringa del tipo xxxxxx/N dove la parte xxxxxx può essere lunga
da 3 a 7 o più caratteri, però termina sempre per /N
devo selezionare soltanto la parte xxxxxx e farla diventare una nuova
stringa ma non riesco a trovare il modo per farlo!!!
Chi mi aiuta, gentilmente ?
ringrazio anticipatamente
Matteo

Cups scriveva il 13/06/2007 :

Se parli di VB6:
Dim Stringa as string
Dim Posizione as Long
Dim Delimitatore as String
Dim Risultato as String
Delimitatore = "/N"
Stringa="123654/N"
Posizione=Instr(Stringa, Delimitatore)
Risultato=""
If Posizione>=4 and Posizione<=8 then _
     Risultato=Left$(Stringa, Posizione-1)
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.

 > Chi mi aiuta, gentilmente ?
Per VB6 puoi usare questa funzione più generica per splittare una
stringa su un delimitatore:
Function ParseString(ByVal StringToParse As String, Delimitatore As
String, ByVal ValoreDaPrendere As Integer) As String
Dim CmdFields(30) As String
Dim n As Integer
Dim Campo As Byte
  Campo = 1
  For n = 1 To Len(StringToParse)
    If Mid$(StringToParse, n, 1) = Delimitatore Then
      Campo = Campo + 1
    Else
      CmdFields(Campo) = CmdFields(Campo) & Mid$(StringToParse, n, 1)
    End If
  Next n
ParseString = CmdFields(ValoreDaPrendere)
End Function
e la chiami così:
sMiaStringa = ParseString("123456/N","/",1)
sMIaStringa sarà uguale a 123456
Ciao

 sMiaStringa = ParseString("123456/N","/",1)
Per la serie "scopriamo cose nuove", in realtà in VB6 esiste la Split(), già 
bell'e fatta, ottimizzata e senza incasinarsi sempre la vita :)
sMiaStringa = Split("123456/N", "/")(0)
Poi però bisogna controllare se quanto ricavato ricade nei parametri.
Comunque in questo caso preferisco la soluzione di Albe, anche se 
ottimizzabile mettendo Risultato=""
 nell'Else.
Ciao 

Fabio wrote:
Oh quanti suggerimenti qualificati :)
Dico anche la mia:
NuovaStringa = Left(Stringa, Len(Stringa)-2)
-- 
Greg 

"greg" ha scritto:

Visto che Cups asserisce che TUTTE le stringhe terminano con "/N", anche io 
avrei fatto bellamente così! Magari aggiungendo soltanto un piccolo 
controllo di errore sulla lunghezza, per evitare crash indesiderati. :)
If Len(NuovaStringa)>1 Then NuovaStringa = Left(Stringa, Len(Stringa)-2)

Grazie delle tante righe di codice,
per i suggerimenti più lunghi dovrò leggermi bene bene il codice per
capire a fondo: vi ricordo che sono "nuovo" in VB e confermo di usare
VB6...
Alla prossima e buona giornata
Matteo

 VB6...
"Sono nuovo" e "uso VB6" sembrerebbero antitetici, anche se lo leggo con 
una frequenza sconcertante ;-)
Se non hai motivi particolari (leggi necessità di lavoro) mollalo fino a 
che sei in tempo, e passa a qualcosa che sia uscito almeno nel 
ventunesimo secolo...
-- 
news:it-alt.comp.software.openoffice : Il newsgroup dedicato a
OpenOffice.org, la suite open source di applicazioni per ufficio.
Saluti, VITRIOL

 ventunesimo secolo...
qualche suggerimento ?
VB.NET
 ?
TnX
Matteo

 
VB.NET
 ?
VB 2005 e/o C# 2005 per .NET; Turbo Delphi se intendi programmare ancora 
per Win32.
Tutti questi ambienti contemplano anche una versione completamente 
gratuite, quindi non ci sono scuse :-)


 gratuite, quindi non ci sono scuse :-)
insomma... sono entrato nella spirale !!! :-)
Ne terrò conto, grazie !!!
Matteo

 fermo...
Tanto sei novizio anche di VB6, quindi non ti cambia nulla iniziare con 
qualcosa al passo coi tempi :-)
Scarica VB 2005 Express, installalo e comperati un libro per iniziare. 
Puoi anche trovare tutta la documentazione che ti serve in rete o nella 
guida in linea ma, all'inizio, forse č meglio iniziare con un buon 
libro, che č sicuramente meno dispersivo.


 Scarica VB 2005 Express, installalo e comperati un libro per iniziare.
Ma Vb.Net č la versione successiva di VB 2005 Express? O sono 2 cose 
diverse?
greg 

 If Len(NuovaStringa)>1 Then NuovaStringa = Left(Stringa, Len(Stringa)-2)
Si, avevo tralasciato la gestione errori, però se vogliamo farla è meglio 
testare la lunghezza di Stringa, e non di NuovaStringa.
E visto che ci siamo, testiamo che sia maggiore di 2 e non di 1.
greg 

 diverse?
VB 2005 è l'ultima edizione definitiva disponibile, più recente delle 
precedenti due edizioni di 
VB.NET
. Compila sempre per .NET, ma questa 
sigla è stata tolta dal nome perché ormai è sottinteso...
Express indica la versione gratuita, liberamente scaricabile ed 
utilizzabile. In pratica è un sottoinsieme monolinguaggio di Visual 
Studio 2005, con alcune limitazioni (poche) a livello di IDE.


 VB 2005 è l'ultima edizione definitiva disponibile
definitiva da qui a li'.
http://tinyurl.com/2pyeeq
finche' non si chiariscono le idee e continuano a cazzeggiare, mi dispiace, 
passo.
loro manco se ne accorgeranno, ma io si',  e il mio lavoro pure, visto che 
non lavoro per loro :PPP

"greg" <gr...@tin.it.invalid> ha scritto

e che non sia "".
trim(), questo sconosciuto.
ciao, a. 

 non lavoro per loro :PPP
Non sei obbligato ad aggiornare. I Framework sono retrocompatibili e, al 
limite, installabili side-by-side.


andrea palazzi ha spiegato il 14/06/2007 :

Option Explicit
Private Sub Command1_Click()
Dim Stringa As String
Stringa = "123456/N"
Debug.Print "Atteso: 123456"
Debug.Print "Fun. Estrai: " & Estrai(Stringa)
Debug.Print "Fun. ParseString: " & ParseString(Stringa, "/", 1)
Debug.Print "Fun. Split: " & Split(Stringa, "/N")(0)
Debug.Print "Fun. Left: " & Left(Stringa, Len(Stringa) - 2)
Stringa = "123456/N    "
Debug.Print "Atteso: 123456"
Debug.Print "Fun. Estrai: " & Estrai(Stringa)
Debug.Print "Fun. ParseString: " & ParseString(Stringa, "/", 1)
Debug.Print "Fun. Split: " & Split(Stringa, "/N")(0)
Debug.Print "Fun. Left: " & Left(Stringa, Len(Stringa) - 2)
Stringa = "123456"
Debug.Print "Atteso: <empty>"
Debug.Print "Fun. Estrai: " & Estrai(Stringa)
Debug.Print "Fun. ParseString: " & ParseString(Stringa, "/", 1)
Debug.Print "Fun. Split: " & Split(Stringa, "/N")(0)
Debug.Print "Fun. Left: " & Left(Stringa, Len(Stringa) - 2)
Stringa = "1234567890/N"
Debug.Print "Atteso: <empty>"
Debug.Print "Fun. Estrai: " & Estrai(Stringa)
Debug.Print "Fun. ParseString: " & ParseString(Stringa, "/", 1)
Debug.Print "Fun. Split: " & Split(Stringa, "/N")(0)
Debug.Print "Fun. Left: " & Left(Stringa, Len(Stringa) - 2)
Stringa = ""
Debug.Print "Atteso: <empty>"
Debug.Print "Fun. Estrai: " & Estrai(Stringa)
Debug.Print "Fun. ParseString: " & ParseString(Stringa, "/", 1)
Debug.Print "Fun. Split: " & Split(Stringa, "/N")(0)
Debug.Print "Fun. Left: " & Left(Stringa, Len(Stringa) - 2)
End Sub
Private Function Estrai(ByVal Stringa As String, Optional ByVal 
Delimitatore As String = "/N") As String
    Dim Posizione As Long
    Posizione = InStr(Stringa, Delimitatore)
    Estrai = ""
    If Posizione >= 4 And Posizione <= 8 Then _
       Estrai = Left$(Stringa, Posizione - 1)
End Function
Private Function ParseString(ByVal StringToParse As String, 
Delimitatore As String, ByVal ValoreDaPrendere As Integer) As String
Dim CmdFields(30) As String
Dim n As Integer
Dim Campo As Byte
  Campo = 1
  For n = 1 To Len(StringToParse)
    If Mid$(StringToParse, n, 1) = Delimitatore Then
      Campo = Campo + 1
    Else
      CmdFields(Campo) = CmdFields(Campo) & Mid$(StringToParse, n, 1)
    End If
  Next n
ParseString = CmdFields(ValoreDaPrendere)
End Function
Alberto
-- 
Carlo Rubbia: Siamo su un treno che va a trecento chilometri all'ora, 
non sappiamo dove ci sta portando e, soprattutto, ci siamo accorti che 
non c'è il macchinista.


Beh, mica tanto :(
Sono mesi che stanno lavorando al Fw 4.0 mentre noi siamo ancora al 2.0, e 
già il 3.0 mi spaventa, con l'introduzione di novità che stravolgono ancora 
tutto (XAML in primis).
Sinceramente stavo pensando di passare a Mono così almeno sono svincolato da 
Windows (un altro bidone di novità malfunzionanti).
Linux mi risulta spesso inusabile, ma io più che programmare e leggere la 
posta non faccio e questo dovrei riuscire ad ottenerlo, se solo si 
inventassero un'ide decente (monodevelop fa schifo).
Ciao 

 meglio testare la lunghezza di Stringa, e non di NuovaStringa.
Ops... ecciai ragione!!
Mi era partito un colpo di "copia-incolla"... :-))
Sorry...

 tutto (XAML in primis).
Ma sono ancora supportate tutte le vecchie funzionalità, anche Windows 
Forms.
Non si è costretti a cambiare subito tutto se non se ne ha l'esigenza.


 inventassero un'ide decente (monodevelop fa schifo).
Ho guardato un po' sul forum di SharpDevelop, e anche lì è stata 
sollevata la questione.
Pare che SharpDevelop non sia facilmente portabile su Mono, perché il 
codice è infarcito di P/Invoke. Che, tra l'altro, molti considerano 
ormai inutili e residuo delle prime versioni.
Mi sa che ci vorrebbe qualcuno che si sobbarcasse una revisione completa...


 completa...
Sì, avevo guardato proprio ieri: #D non è il massimo ma sarebbe un bel passo 
avanti, purtroppo sul forum dicono che non hanno intenzione di portarlo 
perchè su linux c'è già monodevelop (invece sotto win che ci sono le ottime 
ver. express non fa niente...), l'ho messo sotto Moma e di robe mancanti ce 
ne sono parecchie. Purtroppo Mono è ancora indietro un pacco.
E non ho capito perchè hanno voluto a tutti i costi fare le gtk# e non usare 
gtk come base per le winform.
Ciao 

Albe V° wrote:
Albe, ho provato il tuo codice e funziona [a parte i 2 ultimi casi (Split e 
Left) dove arriva l'errore per via della stringa esempio vuota] ma, sai che 
a una prima occhiata in diversi punti non lo capisco? Se non fossi al 
corrente del discorso, mi chiederei: che diavolo fa questo codice? Per me è 
meritevole di andare ai campionati di... come si chiamano? Codice Offuscato? 
E lo intendo come un complimento, eh. Non te la prendere :)
Tornando al nostro caso, la Left fallisce in soli due casi: stringa vuota, o 
con spazi vuoti a destra.
Ma sono 2 casi gia esclusi in partenza dal postatore iniziale, Cups, 
altrimenti c'era gia pronta la Trim, suggerita da Andrea, + se len = 0 
chiedi istruzioni o esci.
-- 
Greg 

 un complimento, eh. Non te la prendere :)
Quale, quello di albe?
Sono le 2 (DUE) righe standard per fare questo tipo di operazioni: trova la 
posizione di "/", tronca la stringa.
Davvero non vedo cosa ci sia di così bizzarro.
La ParseString è di Marcolino, ma è una riscrittura piena di problemi della 
Split.
Ciao 

 trova la posizione di "/", tronca la stringa.
Ma....noi non abbiamo bisogno di trovare la posizione di "/". Sappiamo già, 
dalle specifiche, che DEVE trovarsi SEMPRE in penultima posizione.
-- 
Greg 

 Non si è costretti a cambiare subito tutto se non se ne ha l'esigenza.
"Manfatti", io uso ancora VB5 :-P
Bye, G. 

"greg" <gre...@tin.it.invalid> ha scritto nel messaggio 
news:f4s3pc$18n$1...@tdi.cu.mi.it...

Beh, la questione era il codice "incomprensibile" e non le specifiche, che 
comunque non sono chiare, infatti i test di albe lo dimostrano.
A parte questo, se termina sempre per "/N", come da specifiche, allora tanto 
vale anche una Replace("xxxxxx/N", "/N", "")
Ciao 

greg ha pensato forte :

Beh, di specifiche abbiamo ben poco.
Ho fatto un ragionamento pragmatico: chi deve estrarre un dato utile da 
una stringa con terminatori, in genere ottiene questa stringa da un 
file di testo (txt, htm,...) o da una qualche porta (seriale, winsock, 
ecc...).
Vista così, il fatto che /N sia la fine stringa è la situazione normale 
ma non l'unica che possiamo trovarci di fronte. Ho quindi scritto un 
qualcosa di discretamente robusto, pur senza addentrarmi in chissà 
quale parser.
Ciao
Alberto
-- 
Karl Marx: Le circostanze fanno l'uomo non meno di quanto l'uomo faccia 
le circostanze.

 "Manfatti", io uso ancora VB5 :-P
E magari in accoppiata al buon vecchio DAO :)
-- 
Greg 

 E magari in accoppiata al buon vecchio DAO :)
Nah :-P.
Normali record: Type, Open for Random, Put, Get, eccetera,
in un flat file.
Problemi di compatibilità: 0
Problemi di installazione: 0
Problemi di portabilità: 0
Problemi di pesantezza: 0
Problemi di robustezza: 0
Problemi di collegamento: 0
Problemi di rete: 0
Problemi di velocità: 0 (per i miei usi, ovviamente).
Per i piccoli DB, è un sistema imbattibile.
Bye, G. 

 tanto vale anche una Replace("xxxxxx/N", "/N", "")
sta diventando un po' accademia, il risultato non cambia, ma dato che 
l'input dovrebbe essere non la costante ma una variabile
s=replace(s, "/N", "")
imo allunghi i tempi, costringendolo a guardare se /n non sia anche altrove 
nella stringa, che si deve spazzolare tutta per coppie di caratteri.
se /n sono _sempre_ gli ultimi due caratteri, la soluzione di greg mi sembra 
la piu' veloce.
bisognerebbe provare inserendo le due soluzioni in un ciclo di ennemila 
volte e facendo il timing.
ciao, a.

 E magari in accoppiata al buon vecchio DAO :)
be', certo. conosci qualcosa di piu' recente altrettanto veloce e 
affidabile? :)

 in un flat file.
abebe', allora si'. anch'io ultimamente quando posso uso dei gnocchissimi 
txt, gia' gli ini sono troppo strutturati, figurarsi quelle cosacce tipo *ml 
:)

 qualcosa al passo coi tempi :-)
sono del tuo stesso parere e vedrò di informarmi perchè queste cose mi
interessano, anche se non sono un programmatore nè un informatico...
...però in laboratorio EMC mi gira VB6 e per tanto devo conoscere a
fondo VB6 per metter mano ai programmi che sono al 90% custom...
Grazie ancora
Matteo

 Per i piccoli DB, è un sistema imbattibile.
Piccoli/grandi quanto? 100-200 mila records?
greg 

Il giorno Thu, 14 Jun 2007 23:56:41 +0200, "Paperino" <non...@lo.dico.invalid>
ha scritto:

Anch'io uso VB5 e dove posso scrivo su files, quoto tutto.
--
ciao
  Stefano

 ver. express non fa niente...)
Una delle cose che mi mancano di più quando uso VS Express è la 
"indentazione a comando" (Ctrl+I in #D). Non esiste una cosa simile in VS?


 "indentazione a comando" (Ctrl+I in #D). Non esiste una cosa simile in VS?
Alte cose comode in #D, delle quali non ho trovato equivalenti in VS. 
Ovviamente si accettano consigli :-)
Iconcina visualizzata a fianco del codice di ogni membro. Ti fa capire a 
colpo d'occhio cos'è e, se cliccata, espone diverse funzioni utili:
http://img519.imageshack.us/img519/5173/iconegi0.png
Informazioni su un membro visualizzabili semplicemente passando il 
cursore sul codice:
http://img256.imageshack.us/img256/249/guidaqh2.png
Evidenziazione delle parentesi corrispondenti:
http://img256.imageshack.us/img256/378/parentesixu2.png


 Piccoli/grandi quanto? 100-200 mila records?
Meno. Finora al massimo un 10-20.000. Per la roba più grande, beh...
sono andato apposta a fare il corso DBA alla Oracle University ;-).
Bye, G.