Newsgroup: it.comp.lang.visual-basic
Titolo: [VB6] separare stringa tra virgole

ciao
Ho la seguente linea (variabile) su singola riga separata alla fine da un 
chr13 da dover interpretare...
A,L,00212,R,00001,00070,00430,01220,00001,00030,00000,00010,00015,00001,01220,00000,00001,03049,00000,13840
quindi devo identificare ogni campo tra le virgole.
Cosa consigliate come sistema veloce e diretto?
credo un complesso tra ubound e instr... più veloce del classico for x = 1 
to len(stringa)...
Grazie MILLE!
Anto

 Cosa consigliate come sistema veloce e diretto?
La Split non va bene ?
Bye, G. 

"Paperino" <non...@lo.dico.invalid> ha scritto nel messaggio 
news:gf4mtn$2mt$1...@registered.motzarella.org...

Vero!!!
grazie del remember!
Dim mystring() As String
Dim Xnr As Integer
mystring = Split(car, ",", -1, 1)
For xx = 0 To UBound(mystring)
    MsgBox Trim(mystring(xx)) & " - Nr." & xx
Next
tanks!

 tanks!
un mini consiglio. se hai "a,b,c"
costruisci una stringa
a vbnewline + b vbnewline + c vbnewline
o simili,
e metti il msgbox del risultato dopo il next, non dentro al ciclo... :)
ciao 

 e metti il msgbox del risultato dopo il next, non dentro al ciclo... :)
Ciao, grazie del consiglio...
comunque l'esempio del msgbox era puramente "dimostrativo delle singole 
variabili ottenute" per avere un eventuale esempio utile a terzi e metterlo 
dopo il ciclo farebbe vedere tutte 15 assieme...
Cosě verifico unicamente al volo e "dimostrativamente" che funziona.
Infatti io dopo utilizzo i dati individualmente mettendoli in lbl apposite 
in un form specifico per la verifica/conferma di tutti i dati ottenuti.
Ho invece un problema di verifica che mi salta ogni tanto le linee dato che 
sono dati provenienti da una scheda seriale che uso con questo semplice 
input che magari mi puoi aiutare a rendere piů "sicura" nel rilevamento dei 
dati che dovrebbe "leggere" ogni singola linea tra l'inizio riga e il vbcrlf 
e attualmente la linea variabile "car" mi arriva a contenere diverse linee:
Quindi ricevo dati dalla rs232 e credo che debba visionare la variabile 
nella txbox nel for next ma non saprei bene come modificare.... cosě 
funziona ma non mi soddisfa.... qualche semplice consiglio?
---cut---
If MSComm1.InBufferCount > 0 Then
        car = MSComm1.Input
       ' verifico per ogni linea che comincia con chr2 e metto un vbcrlf per 
vederlo nella tbox.
        For xx = 1 To Len(car)
            If Mid(car, xx, 1) = Chr(2) Then
                car = Mid(car, 1, xx - 1) + Mid(car, xx + 1)
            End If
            If Mid(car, xx, 1) = Chr(13) Then
                car = Mid(car, 1, xx - 1) + vbCrLf + Mid(car, xx + 1)
            End If
        Next
      ' stranamente ogni tanto mi ritrovavo ancora un chr2 e qui lo 
ritolgo...
    For xx = 1 To Len(car)
        If Mid(car, xx, 1) = Chr(2) Then
            car = Mid(car, 1, xx - 1) + Mid(car, xx + 1)
        End If
    Next
    TBox.Text = TBox.Text & car
    TBox.SelStart = Len(TBox.Text)
    car = ""
End If
---cut---
ciao e grazie per qualche consiglio di "miglioramento del mio contorto 
sistema"... :-))
CIAO

 per vederlo nella tbox.
non sono sicuro di avere capito, ma non puoi fare qualcosa tipo
    car=replace(car, chr$(2), vbnewline)
?
ciao

 ?
E daiiie che mi freghi n'altra volta.... :-))))
effettivamente il replace potrebbe andare meglio e non perderne per 
strada...
Stasera quando rientro a casa verifico col codice...
è strano che debba me
Ma il grosso problema che ho è un altro, non riesco a risolvere e non so se 
riesco a spiegarmi:
Dalla RS232 continuano ad arrivare dati da questa scheda (chiamiamolo anche 
modem...)
Questi dati nel loop "If MSComm1.InBufferCount > 0 Then" vengono messi in 
successione e continuamente nel if then senza una particolare regolarità se 
non quella temporale d'arrivo.
Questi dati NON sempre iniziano da inizio linea e vanno a fine riga vbcrlf 
tanto da non avere una "linea" in una variabile che è sempre quella 
"giusta".
Infatti potrebbe iniziare da metà della prima riga e finire a metà della 
seconda riga
Di modo che la stringa "car" dei caratteri non sarebbe interpretabile 
correttamente.
In questo loop di ricezione dalla RS232 io devo poter avere o meglo vedere 
"riga per riga" in una variabile2 che inizia da inizio riga e finisce a fine 
riga col classico chr13, la interpreto, la visualizzo e la butto passando 
alla prossima.
Senza questo, attualmente quando parto perdo i primi caratteri o se arrivano 
due linee assieme vedo solo l'ultima e non la prima o se ricevo dal buffer 
metà prima e metà seconda, non vedo nulla se non i caratteri a schermo che 
mi butta il buffer nella textbox.
In pratica devo intevervenire in continuo sul buffer in arrivo e "vedere" 
ogni singola linea da inizio riga sinistra a fine riga destra, metterlo in 
variabile "stringa" e passare alla prossima riga... e aspettare se non è 
completa pur mostrando "l'arrivato" come ora nella textbox ma aspettando il 
chr13 per prenderla da interpretare e cosî via....
brrrrr.... non mi dirai anche stavolta un comando singolo.... :-))))hehehe
GRAZIE dei preziosissimi consigli
Anto

 brrrrr.... non mi dirai anche stavolta un comando singolo.... :-))))hehehe
:)
non ho mai maneggiato delle seriali, ci capisco poco, ma mi sembra ci debba 
essere un modo più pratico di gestire il buffer di input.
spero che qualcun altro ti sappia consigliare.
ciao 

 chr13 per prenderla da interpretare e cosî via....
Si, le seriali si gestiscono così.
Alberto
-- 
Il tuo stesso identico umore,
ma la divisa di un altro colore



Si chiama polling, e si gestisce elaborando un buffer, o meglio facendo un
parser del buffer accumulato.
Tra l'altro a volte si mettono dei CRC o caratteri di controllo a fine linea per
verificare la coerenza e l'integrità delle stringhe in arrivo.
Se ti sembra complicato da fare in VB, consolati pensando che io l'ho fatto in
assembler su qualche microcontrollore.
--
ciao
  Stefano

 Si, le seriali si gestiscono così.
e in VB6 per mettere in variabile ogni riga per riga che entra nel buffer 
hai qualche consiglio?
ciao grazie
Anto


e in VB6 per mettere in variabile ogni riga per riga che entra nel buffer 


Sembra che apipapip abbia detto :

Il concetto di 'riga per riga' è un concetto tutto tuo.
Le seriali non hanno il concetto di riga, sono stream di bit e basta.
Se tu hai un qualcosa che ti dica "è finita una riga", e questo 
qualcosa sai solo tu cosa sia, se un terminatore, un fine riga (che a 
sua volta dipenderà dal sistema), altro, dipenderà dal protocollo.
Una volta definito quale sia questo oggetto di 'fine riga', uno split 
andrebbe benissimo.
Alberto
-- 
Henry David Thoreau: L'uomo è tanto più ricco quanto meno costano i 
suoi piaceri.

 andrebbe benissimo.
Si ok Alberto,
grazie delle info... mi scuso se non sono proprio preciso nella spiegazione 
diretta...
Il problema che avrei anche con lo split è che io posso ricevere ad esempio 
nello stesso "stream di bit" informazioni "splittabilui" e altre no, se non 
per metterle assieme alle seguenti... e per fare lo split dovrei già avere 
la variabile pronta.
Ad esempio... se il mio "fine riga" che ricevo chr13 non si trova nello 
"stream di bit" per quello "stream di bit" ricevuto durante il
If MSComm1.InBufferCount > 0 Then
splittando la variabile "catturata" l'ultimo pezzo dovrà andare assieme al 
primo pezzo del prossimo stream di bit fino al primo chr13 e seguire col 
primo chr2 idem se non ha inizio con il chr2 se non ho nulla prima lo 
censtino... ma da lì in avanti devo poter interpretare tutto quello che 
arriva...
Se quindi non voglio perdere nulla per strada, devo tenere conto anche di 
questi "mezzi o multi stream di bit" tra un mio separatore ed un altro... 
intere o meno...
A meno di vedere un carattere alla volta... e "vedere singolarmente" ogni 
singolo carattere in arrivo...ricostruendo alla fonte ogni singola 
variabile, ma poi credo che rallenterebbe paurosamente in presenza di 
unflusso di dati continuo.
Praticamente nelle mie "stringhe da interpretare" hanno un separatore che è 
un chr2 d'inizio e un chr13 di fine e in continuo.
Sulla txtbox vedo tutto ma non so appunto come verificare quanto sopra in un 
"loop" continuo senza perdere i dati del buffer non completi ma spezzettati 
"a metà"...
mi scuso la mia concettualità un po' così ma credo di aver esposto questo 
problema che mi assilla mica male...e qui mi perdo....finora non sono 
riuscito a "metterla giù"...
ciao grazie per eventuali consigli!
Anto

unflusso di dati continuo.
Se fai un polling il prog. è sempre sulla porta, quindi la gestione di un byte
alla volta non impegna di + in processore, e lo fai con   MSComm1.InputLen = 1
--
ciao
  Stefano

 intere o meno...
Certo.
Quando dicevo che le seriali si gestiscono proprio così, intendevo che 
ad ogni check dello stream memorizzato in una stringa propria, ci sarà 
una parte 'valida' che viene gestita, ed un residuo che viene 
concatenato col successivo stream, ecc..., e subito dopo ogni append si 
fa un check, e così via.
Qualunque altro metodo non è affidabile.
Ciao
Alberto
-- 
La forza di volontà è guardare negli occhi una ragazza in topless.

 non ho il VB su questa macchina.
Grazie Stefano
stasera quando rientro provo subito... infatti č quel "ricordare quel che 
viene dopo l'ultimo chr13" del buff che non so come tenere a mente nel 
"loop".
Vedo di farlo a "pacchetti" o con inputlen1 e contare caratere per carattere 
prima di buttarlo via
Grazie 1000 dei preziosi consigli!!
Anto