Il linguaggio Visual Basic di Microsoft
 

Parsing di un ******* di testo

aren.hoxha@gmail.com 27 Ago 2015 23:48
Salve a tutti,

mi servirebbe un consiglio sull'argomento del parsing di un ******* di testo
delimitato da virgole

La mia situazione al momento è questa :

13, 28 °C,14, 28 °C,15, 28 °C,22, 27 °C,23, 26 °C,24, 27 °C,33, 26 °C,34,
27 °C,35, 26 °C,36, 27 °C,49, 29 °C,50, 29 °C
51, 29 °C,54, 27 °C,55, 27 °C,56, 27 °C,61, 29 °C,62, 29 °C,63, 29 °C,64,
29 °C,65, 29 °C,66, 29 °C,11,-1.00 bar,18,-0.99 bar
19,-1.00 bar,20,-1.00 bar,21,-0.99 bar,22,-0.99 bar,23,-0.99 bar,25,-1.00
bar,26,-1.00 bar,27,-0.99 bar,28,-1.00 bar,29,-0.99 bar,30,-0.99 bar,31,-0.99
bar
33,-1.00 bar,34,-0.99 bar,35,-0.99 bar,36,-1.00 bar,37,-1.00 bar,38,-0.99
bar,39,-1.00 bar,41,-1.00 bar,42,-0.99 bar,43,-1.00 bar,44,-0.99 bar,45,-1.00
bar
46,-0.99 bar,47,-1.00 bar,65,-1.00 bar,66,-0.99 bar,67,-0.99 bar,68,-0.99
bar,69,-0.99 bar,70,-0.99 bar,71,-0.99 bar,73,-1.00 bar,74,-1.00 bar,75,-0.99
bar
77,-0.99 bar,78,-0.98 bar,81,-0.99 bar,82,-0.99 bar,83,-0.99 bar,84,-1.00
bar,85,-0.99 bar,86,-0.98 bar,87,-0.99 bar,89,-0.99 bar,90,-1.00 bar,91,-1.00
bar
93,-0.99 bar,94,-0.99 bar,,,,,,,,,,,,,,,,,,,,
13, 28 °C,14, 28 °C,15, 28 °C,22, 27 °C,23, 26 °C,24, 27 °C,33, 26 °C,34,
27 °C,35, 26 °C,36, 27 °C,49, 29 °C,50, 29 °C
51, 29 °C,54, 27 °C,55, 27 °C,56, 27 °C,61, 29 °C,62, 29 °C,63, 29 °C,64,
29 °C,65, 29 °C,66, 29 °C,17,-1.00 bar,18,-0.99 bar
19,-1.00 bar,20,-1.00 bar,21,-0.99 bar,22,-0.99 bar,23,-0.99 bar,25,-1.00
bar,26,-1.00 bar,27,-0.99 bar,28,-1.00 bar,29,-0.99 bar,30,-0.99 bar,31,-0.99
bar
33,-1.00 bar,34,-0.99 bar,35,-0.99 bar,36,-1.00 bar,37,-1.00 bar,38,-0.99
bar,39,-1.00 bar,41,-1.00 bar,42,-0.99 bar,43,-1.00 bar,44,-0.99 bar,45,-1.00
bar
46,-0.99 bar,47,-1.00 bar,65,-1.00 bar,66,-0.99 bar,67,-0.99 bar,68,-0.99
bar,69,-0.99 bar,70,-0.99 bar,71,-0.99 bar,73,-1.00 bar,74,-1.00 bar,75,-0.99
bar
77,-0.99 bar,78,-0.98 bar,81,-0.99 bar,82,-0.99 bar,83,-0.99 bar,84,-1.00
bar,85,-0.99 bar,86,-0.98 bar,87,-0.99 bar,89,-0.99 bar,90,-1.00 bar,91,-1.00
bar
93,-0.99 bar,94,-0.99 bar,,,,,,,,,,,,,,,,,,,,


ecc

quello che vedete sono valori di temperatura e pressione. Ogni valore ha davanti
un numero che sarebbe l'ID di quella temperatura.

le tante virgole delimitano ogni minuto della lettura

Quello che vorrei fare è avere i valori dell'ID 13 tutti in un unico array.

In genere ci saranno circa 700 letture, quindi ogni array avrà 700 elementi.

Il quesito ora è questo, come faccio a farlo?

vorrei avere qualcosa tipo :

array ID13 con valori (28°C, 28°C ......)
array ID17 con valori (-1.00 bar, -1.00 bar...)

Grazie.
aren.hoxha@gmail.com 28 Ago 2015 00:14
Dimenticavo, è VB6.
mmm 28 Ago 2015 09:48
aren.hoxha@gmail.com wrote:
> Salve a tutti,
>
> mi servirebbe un consiglio sull'argomento del parsing di un ******* di testo
delimitato da virgole
>
> La mia situazione al momento è questa :
>

<snip>

>
> ecc
>
> quello che vedete sono valori di temperatura e pressione. Ogni valore ha
davanti un numero che sarebbe l'ID di quella temperatura.
>
> le tante virgole delimitano ogni minuto della lettura

non si capisce se sono tante linee o un'unica linea, comunque questo e'
un fatto secondario ( elaborazione da fare una linea alla volta o in un
colpo solo )

>
> Quello che vorrei fare è avere i valori dell'ID 13 tutti in un unico array.
>
> In genere ci saranno circa 700 letture, quindi ogni array avrà 700 elementi.
>
> Il quesito ora è questo, come faccio a farlo?
>
> vorrei avere qualcosa tipo :
>
> array ID13 con valori (28°C, 28°C ......)
> array ID17 con valori (-1.00 bar, -1.00 bar...)
>

NOTA: per i dettagli sulle funzioni usate nel seguito consulta l'help in
linea del VB6

Split ti permette suddividere una stringa in un vettore di stringhe
specificando il separatore ( la virgola nel caso specifico )

a questo punto ha un vettore che agli indici pari 0,2,4 ... contiene
l'ID e agli indici dispari ( 1,3,5 ... ) contiene i valori

UBound e LBound ti danno le dimensioni del vettore un ciclo for con
passo 2 ed il gioco e' praticamente fatto

Redim ri permette di ridimensionare a piacimento un vettore ( per
allargarlo secondo necessita' )

soluzione piu' "elegante" ma piu' complessa da implementare e' non usare
split, ma scandire la stringa d'input un carattere alla volta alla
ricerca delle singole virgole in modo da avere i singoli campi (
alternativamente ID e valore ) ubno alla volta

questa soluzione ti permette di scandire ******* di dati arbitrariamente
grandi senza doverli trasformare in un vettore temporaneo.

> Grazie.
Franz_aRTiglio 28 Ago 2015 15:21
Il 27/08/2015, aren.hoxha@gmail.com ha detto :
> mi servirebbe un consiglio sull'argomento del parsing di un ******* di testo
> delimitato da virgole


Private Sub Command1_Click()

Dim Txt2Ck As String, TxtBuf As String, ThePos As Integer
Txt2Ck = "13, 28 °C,14, 28 °C,15, 28 °C,22, 27 °C,23, 26 °C,24, 27
°C,33, 26 °C,34, 27 °C,35, 26 °C,36, 27 °C,49, 29 °C,50, 29 °C,51, 29
°C,54, 27 °C,55, 27 °C,56, 27 °C,61, 29 °C,62, 29 °C,63, 29 °C,64, 29
°C,65, 29 °C,66, 29 °C,11,-1.00 bar,18,-0.99 bar,19,-1.00 bar,20,-1.00
bar,21,-0.99 bar,22,-0.99 bar,23,-0.99 bar,25,-1.00 bar,26,-1.00
bar,27,-0.99 bar,28,-1.00 bar,29,-0.99 bar,30,-0.99 bar,31,-0.99
bar,33,-1.00 bar,34,-0.99 bar,35,-0.99 bar,36,-1.00 bar,37,-1.00
bar,38,-0.99 bar,39,-1.00 bar,41,-1.00 bar,42,-0.99 bar,43,-1.00
bar,44,-0.99 bar,45,-1.00 bar,46,-0.99 bar,47,-1.00 bar,65,-1.00
bar,66,-0.99 bar,67,-0.99 bar,68,-0.99 bar,69,-0.99 bar,70,-0.99
bar,71,-0.99 bar,73,-1.00 bar,74,-1.00 bar,75,-0.99 bar,77,-0.99
bar,78,-0.98 bar,81,-0.99 bar,82,-0.99 bar,83,-0.99 bar,84,-1.00
bar,85,-0.99 bar,86,-0.98 bar,87,-0.99 bar,89,-0.99 bar,90,-1.00
bar,91,-1.00 bar,93,-0.99 bar,94,-0.99 bar,,,,,,,,,,,,,,,,,,,,"

Dim ArrayVal(800, 2) As String

For i = 1 To Len(Txt2Ck)
If Mid(Txt2Ck, i, 1) <> "," Then
TxtBuf = TxtBuf & Mid(Txt2Ck, i, 1)
Else
If Len(CStr(Val(TxtBuf))) = Len(TxtBuf) Then
ThePos = Val(TxtBuf)
Else
ArrayVal(ThePos, 0) = ThePos
If InStr(TxtBuf, "°C") Then
ArrayVal(ThePos, 1) = TxtBuf
Else
ArrayVal(ThePos, 2) = TxtBuf
End If
End If
TxtBuf = ""
End If
Next i

MSFlexGrid1.Rows = 1
MSFlexGrid1.Cols = 3
MSFlexGrid1.TextMatrix(0, 0) = ""
MSFlexGrid1.TextMatrix(0, 1) = "°C"
MSFlexGrid1.TextMatrix(0, 2) = "Bar"

For i = 0 To 800
MSFlexGrid1.AddItem ""
MSFlexGrid1.TextMatrix(i + 1, 0) = ArrayVal(i, 0)
MSFlexGrid1.TextMatrix(i + 1, 1) = ArrayVal(i, 1)
MSFlexGrid1.TextMatrix(i + 1, 2) = ArrayVal(i, 2)
Next i

End Sub
aren.hoxha@gmail.com 28 Ago 2015 23:56
Forse non sono stato chiaro neache io, comunque grazie per le risposte.

La soluzione Franz non è quello che mi serve, non fa altro che divedere i
valori quando a me interessa raggruppare i valori dello stesso c*****e.

@Sauro La soluzione prevede IF ma io non posso sapere a priori quali e quanti
campi ho.

il ******* è composto in questo modo comunque :

- Questo è l'output della macchina :

13, 28 °C,14, 28 °C,15, 28 °C,22, 27 °C,23, 26 °C,24, 27 °C,33, 26 °C,34,
27 °C,35, 26 °C,36, 27 °C,49, 29 °C,50, 29 °C
51, 29 °C,54, 27 °C,55, 27 °C,56, 27 °C,61, 29 °C,62, 29 °C,63, 29 °C,64,
29 °C,65, 29 °C,66, 29 °C,11,-1.00 bar,18,-0.99 bar
19,-1.00 bar,20,-1.00 bar,21,-0.99 bar,22,-0.99 bar,23,-0.99 bar,25,-1.00
bar,26,-1.00 bar,27,-0.99 bar,28,-1.00 bar,29,-0.99 bar,30,-0.99 bar,31,-0.99
bar
33,-1.00 bar,34,-0.99 bar,35,-0.99 bar,36,-1.00 bar,37,-1.00 bar,38,-0.99
bar,39,-1.00 bar,41,-1.00 bar,42,-0.99 bar,43,-1.00 bar,44,-0.99 bar,45,-1.00
bar
46,-0.99 bar,47,-1.00 bar,65,-1.00 bar,66,-0.99 bar,67,-0.99 bar,68,-0.99
bar,69,-0.99 bar,70,-0.99 bar,71,-0.99 bar,73,-1.00 bar,74,-1.00 bar,75,-0.99
bar
77,-0.99 bar,78,-0.98 bar,81,-0.99 bar,82,-0.99 bar,83,-0.99 bar,84,-1.00
bar,85,-0.99 bar,86,-0.98 bar,87,-0.99 bar,89,-0.99 bar,90,-1.00 bar,91,-1.00
bar
93,-0.99 bar,94,-0.99 bar,,,,,,,,,,,,,,,,,,,,

E' una lettura di tutti i c*****i. Lo si fa ogni minuto per circa 700 min.
Quindi il ******* di testo presenta lo stesso pezzo di dati per 700 volte!

La fine di ogni lettura, quindi ogni minuto, è diviso da quella serie di
virgole.

La cosa che ho fatto fin'ora è stata creare una matrice a due dimensioni dove
ho i salvato le temperature.

In ordine :

1)Leggo la il primo minuto di output per individuare quanti c*****i unici ho sia
di temperatura che di pressione.
2) Ridimensiono gli array di valori temp e pressione con i c*****i trovati
3) uso InStr per scandagliare tutti i valori e salvo quelli che contengono °C
in un array e quelli che contengono bar in un altro, scarto quelli senza niente
(sono i c*****i)
4) Una volta che ho il numero di c*****i e la totalità di valori, vedo quanti
minuti di lettura ho facendo semplicemente la divisione
righetemp = (UBound(arrTemp) / UBound(c*****iTemp))

Ridimensiono la matrice in questo modo :

ReDim MatriceTemp(UBound(c*****iTemp), righetemp)


dopo popolo la matrice in questo modo :


For n = 1 To UBound(MatriceTemp, 2)

For m = 1 To UBound(MatriceTemp, 1)

i = m + k
MatriceTemp(m, n) = arrTemp(i)

Next
k = i
Next

La soluzione è un pò macchinosa, idee?
Luca D 29 Ago 2015 00:46
Il suggerimento iniziale di "mmm" è quello più pratico, e se lo combini con
l'uso di collection/dictionary (=liste con chiave) è presto fatto.
Come dice lui, lo Split iniziale ti da un array in cui nelle posizioni pari hai
tutti i c*****i, nelle dispari tutti i valori; fai un ciclo "for i = 1 to
ubound(xx) step 2" per recuperare la coppia c*****e (i-1) e valore (i), con il
primo che funge da chiave; fai un test sulla collection per vedere se quella
chiave esiste o meno e di conseguenza crei un nuovo array o accodi all'array
corrispondente a quella chiave ( la collection è un insieme di Variant, e i
Variant possono diventare array se applichi ReDim... Non ho VB6 qui sottomano ma
dovrebbe accettarli).
In una singola passata ottieni una griglia (collection di array) con i valori
raggruppati come serve
Franz_aRTiglio 29 Ago 2015 14:43
Nel suo scritto precedente, aren.hoxha@gmail.com ha sostenuto :

> Forse non sono stato chiaro neache io,

Eh :)

Allordunque:

Tu hai N "bocchi" di dati in arrivo, questi dati, che usano la virgola
come separatore arrivano in formato ID, XX VAL, dove:

ID = identificativo del campione (numerico)
XX = valore del campione (numerico)
VAL = tipo di campione (stringa; "°C" o "Bar")

Considerando che si possono verificare multipli separatori senza ID o
dati (es. ,,,,,,) il tuo scopo e' di separare ogni dato in base al tipo
(°C / bar) per "concatenarli" in una variabile ad indice corrispondente
al' ID del dato stesso.

Quindi, considerando che dalle informazioni date NON e' possibile
predeterminare quanti dati arriveranno ma è solo dato sapere che
saranno
circa 700, risulta un'esercizio macchinoso predeterminare 700 variabili
ad indice da riempire con dati che ......

L'approccio migliore e' IMHO costruire 2 variabili ad indice, FISSE
e non dinamiche, nelle quali inserire i dati, usando l'ID zero della
matrice come puntatore.

Ora, se come immagino hai le idee piu confuse di prima, fai una bella
cosa: carica uno zip dei vari ******* di dati che devi processare da
qualche parte e posta qua il link (la struttura del newsgroup spezza
orribilmente i dati), cosi che si abbia a disposizione una base
concreta sulla quale lavorare.

Links
Giochi online
Dizionario sinonimi
Leggi e codici
Ricette
Testi
Webmatica
Hosting gratis
   
 

Il linguaggio Visual Basic di Microsoft | Tutti i gruppi | it.comp.lang.visual-basic | Notizie e discussioni visual basic | Visual basic Mobile | Servizio di consultazione news.