Newsgroup: it.comp.lang.visual-basic
Titolo: Parsing di un file di testo

Salve a tutti,
 
mi servirebbe un consiglio sull'argomento del parsing di un file 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.

Dimenticavo, è VB6.

 Grazie.

 ha scritto nel messaggio 
news:f723c505-d007-4d13...@googlegroups.com...


 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

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 canale.
 
@Sauro La soluzione prevede IF ma io non posso sapere a priori quali e quanti campi ho.
 
il file è 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 canali. Lo si fa ogni minuto per circa 700 min.
Quindi il file 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 canali unici ho sia di temperatura che di pressione. 
2) Ridimensiono gli array di valori temp e pressione con i canali 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 canali)
4) Una volta che ho il numero di canali e la totalità di valori, vedo quanti minuti di lettura ho facendo semplicemente la divisione 
righetemp = (UBound(arrTemp) / UBound(canaliTemp))
 
Ridimensiono la matrice in questo modo : 
 
ReDim MatriceTemp(UBound(canaliTemp), 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?

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 canali, nelle dispari tutti i valori; fai un ciclo "for i = 1 to ubound(xx) step 2" per recuperare la coppia canale (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

 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 file 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.