Newsgroup: it.comp.lang.visual-basic
Titolo: VB6 - isolare stringa da numero

Salve a tutti,
sono alle prime armi con la programmazione in VB6, finora ho solo 
programmato in asm per i microcontrollori a 8 bit e fatto solo qualcosina 
con VB6.
Vi volevo chiedere una cosa che non mi è molto semplice.
Ho un file di testo contenente queste righe di codice:
G00
G01 X12.1 Y2 F500
G01 X10
M30
dove G00, G01, M30 corrisponde ad un comando ben preciso e X,Y e F sono 
seguite da numeri.
Nel programma che sto cercando di fare devo riconoscere i comandi e isolare 
i numeri che stanno dopo X,Y e F.
Come posso fare?
Se leggo con Line Input #1 .. mi legge ogni riga e il contenuto va in una 
variabile stringa, se invece leggo con Get #1 .. devo fare un algoritmo che 
mi riconosce le lettere G o X o M o F per poi identificare le due cifre 
seguenti da mettere in una variabile integer e leggere lo spazio per 
identificare la fine della cifra o il puntino per indicare il decimale della 
cifra e poi proseguire in questo modo per le restanti.
Forse ho detto una cavolata ma come si può aggirare il problema nel miglior 
modo possibile?
E quando mi capita che tra G01 e X12.1 non c'è lo spazio, come si riesce a 
isolare il numero dalla lettera considerando che dopo il puntino ci possono 
essere almeno 4 cifre?
Lo scopo è isolare le cifre e dove per esempio c'è scritto G01 X10 devo 
riscrivere le stesse cose nel nuovo file convertito ma aggiungendo il 
puntino e almeno uno zero dopo e dove serve, cioé G01 X10.0 oppure G01 X12.1 
Y2.0 F500 altrimenti il programma che mi processa il file non mi riconosce 
correttamente la coordinata X (X10) e Y (Y2). Per la formattazione userei la 
funzione Format..
Grazie
R. 

 R.
Una volta che hai la stringa magari riesci a risolvere tutto con la funzione 
Replace
-- 
Greg 


A) Leggi con line input
B) Identifichi gli elementi della riga con split
C) Scorri tra gli elementi con un ciclo; quello dell'esempio è un file 
di comandi nc, e lo standard prevede uno spazio tra i parametri. Se hai 
dei casi in cui manca lo spazio cambia generatore di codice nc perché 
quello che usi fa cagare.
D) Se le coordinate del file nc iniziano sempre con una sola lettera 
basta una semplice right per leggere il valore, altrimenti puoi fare un 
ciclo per la lunghezza della stringa e controllarne il valore ANSI per 
capire se è un numero o cos'altro. Se trovi una lettera dopo un numero 
(senza spazio prima) hai trovato il parametro successivo inserito senza 
spazio (vedi il punto C).
NB attenzione ai separatori decimali
Il livello di difficoltà di un programma del genere nella scala Mercalli 
della programmazione è 3, fors'anche 2.
Ciao cià :D
-- 
-> GbC|
www.chiappori.com
 


Grazie per le risposte.
Si il listato che ho posto come esempio è la programmazione in RS274 ma 
esistono alcune varianti tipo RS274/D e RS274/X relativo ai gerber per i 
circuiti stampati e il RS274/NGC che è quello che al momento devo usare.
Mi è capitato di leggere un file senza spazi ma la maggior parte sono con 
gli spazi e c'è anche la possibilità di numerare le righe con il suffisso N.
Per ora provo con split.
Grazie ancora!
R. 

news:4e4ad81f$0$44208$4faf...@reader1.news.tin.it... Salve a tutti,

L'ho fatta al volo, guarda se ti va bene:
ff = FreeFile
Open FILE_DA_APRIRE For Binary As #ff
    i = Input(LOF(ff), #ff)
Close #ff
If Len(i) > 0 Then
    c13 = IIf(InStr(i, Chr(13)) > 0, Chr(13), "")
    c10 = IIf(InStr(i, Chr(10)) > 0, Chr(10), "")
    i = Split(i, c13 & c10)
    If UBound(i) > 0 Then
        For n = 0 To UBound(i)
            If Len(Trim(i(n))) > 0 Then
                r = Split(Chr(32) & Trim(i(n)), Chr(32))
                For s = 1 To UBound(r)
                    If Len(Trim(r(s))) > 0 Then
                        Select Case Left(r(s), 1)
                            Case "G":   '---->
                            Case "X":   '---->
                            Case "Y":   '---->
                            Case "F":   '---->
                            Case "M":   '---->
                            Case "...": '---->
                            Case Else:  '---->
                        End Select
                    End If
                Next s
            End If
        Next n
    End If
End If

 ha scritto nel messaggio 
news:4e4c0cf3$0$16649$5fc...@news.tiscali.it...

Ti ringrazio molto, oggi ho elaborato in questo modo:
Open Text2.Text + ".cnc" For Input As #1
Do Until EOF(1)
    Line Input #1, LetturaRiga
    matrice = Split(LetturaRiga, " ")
    i = 0
    For i = 0 To UBound(matrice)
    If Left(matrice(i), 1) = "X" Then                   'isolo la X
    Ncifre = Len(matrice(i))
    Xvalore = (Val(Right(matrice(i), Ncifre - 1)))
    Xvalore = FormatNumber(Xvalore, 3, vbTrue, vbFalse, vbFalse)
    strXvalore = Replace(Xvalore, ",", ".")
    Text3.Text = Text3.Text & " " & "X" & strXvalore & " "
    Else
    End If
    If Left(matrice(i), 1) = "Y" Then                   'isolo la Y
    Ncifre = Len(matrice(i))
    Yvalore = (Val(Right(matrice(i), Ncifre - 1)))
    Yvalore = FormatNumber(Yvalore, 3, vbTrue, vbFalse, vbFalse)
    strYvalore = Replace(Yvalore, ",", ".")
    Text3.Text = Text3.Text & " " & "Y" & strYvalore & " "
    Else
    End If
    If Left(matrice(i), 1) = "Z" Then                   'isolo la Z
    Ncifre = Len(matrice(i))
    Zvalore = (Val(Right(matrice(i), Ncifre - 1)))
    Zvalore = FormatNumber(Zvalore, 3, vbTrue, vbFalse, vbFalse)
    strZvalore = Replace(Zvalore, ",", ".")
    Text3.Text = Text3.Text & " " & "Z" & strZvalore & " "
    Else
    End If
    Next
    Text3.Text = Text3.Text & vbCrLf
Loop
Close #1
Per ora la mia funziona bene, devo solo completarla per includere tutto il 
resto e probabilmente dovrei usare il select case come hai fatto tu, appena 
posso provo anche la tua.
Con FormatNumber il dato in uscita viene fuori con la virgola al posto del 
punto e barbaricamente l'ho sistemata con Replace, c'è un modo migliore per 
avere le cifre col punto?
Grazie ancora.
R. 

avere le cifre col punto?
ff = FreeFile
Open FILE_DA_APRIRE For Binary As #ff
    i = Input(LOF(ff), #ff)
Close #ff
If Len(i) > 0 Then
    c13 = IIf(InStr(i, Chr(13)) > 0, Chr(13), "")
    c10 = IIf(InStr(i, Chr(10)) > 0, Chr(10), "")
    i = Split(i, c13 & c10)
    If UBound(i) > 0 Then
        For n = 0 To UBound(i)
            If Len(Trim(i(n))) > 0 Then
                r = Split(Chr(32) & Trim(i(n)), Chr(32))
                For s = 1 To UBound(r)
                    Lettera = ""
                    Valore = ""
                    If Len(Trim(r(s))) > 0 Then
                        Select Case Left(r(s), 1)
                            Case "G"
                                Lettera = UCase(Left(r(s), 1))
                                Valore = Replace(Right(r(s), Len(r(s)) - 1), 
",", ".")
                            Case "X"
                                Lettera = UCase(Left(r(s), 1))
                                Valore = Replace(Right(r(s), Len(r(s)) - 1), 
",", ".")
                            Case "Y"
                                Lettera = UCase(Left(r(s), 1))
                                Valore = Replace(Right(r(s), Len(r(s)) - 1), 
",", ".")
                            Case "F"
                                Lettera = UCase(Left(r(s), 1))
                                Valore = Replace(Right(r(s), Len(r(s)) - 1), 
",", ".")
                            Case "M"
                                Lettera = UCase(Left(r(s), 1))
                                Valore = Replace(Right(r(s), Len(r(s)) - 1), 
",", ".")
                            Case "..."
                            Case Else
                        End Select
                        If Lettera <> "" And Valore <> "" Then Text3.Text = 
Text3.Text & Lettera & Valore & Chr(32)
                    End If
                Next s
                Text3.Text = Text3.Text & vbCrLf
            End If
        Next n
    End If
End If
Ho leggermente modificato l'algoritmo che ti avevo postato.
Se vuoi provalo, dovrebbe darti in uscita lo stesso risultato del tuo.
Poi scegli tu.
Per quanto riguarda la virgola va piů che bene come hai fatto.


Ciao, ho provato con il tuo codice ma mi da errore di compilazione alla riga 
If Len(1)>0 Then
Credo di andare avanti con il mio codice utilizzando alcune parti del tuo.
Grazie ancora!
R. 

    i = Input(LOF(ff), #ff)
Ciao 

 Ciao
Beh, veramente l'"1" l'ho sostituito alla "i" in quella riga di codice 
perché non funzionava e mi dava quell'errore, poi ho erronaemente copiato la 
riga modificata e non completa come vedi.
Ho risolto portando avanti il codice mio, integrando il select case, che 
oltretutto mi permette di gestire meglio le istruzioni RS274/NGC qualora 
devrò apportare delle modifiche future al programma.
Ecco il listato ultimo.
strRiga = ""                                 'ogni volta cancella tutto il 
contenuto
FileAperto = Text2.Text
FileConvertito = Replace(Text2.Text, ".cnc", ".ngc")
On Error GoTo ErroreNomeFile
Open FileAperto For Input As #1
Open FileConvertito For Output As #2
Do Until EOF(1)
    Line Input #1, LetturaRiga
    matrice = Split(LetturaRiga, " ")
    i = 0
    For i = 0 To UBound(matrice)
    Select Case Left(matrice(i), 1)
        Case "X"                                                    'isolo 
la X
        Ncifre = Len(matrice(i))
        Xvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Xvalore = FormatNumber(Xvalore, 5, vbTrue, vbFalse, vbFalse)
        strXvalore = Replace(Xvalore, ",", ".")
        strRiga = strRiga & "" & "X" & strXvalore & " "
        Case "Y"                                                    'isolo 
la Y
        Ncifre = Len(matrice(i))
        Yvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Yvalore = FormatNumber(Yvalore, 5, vbTrue, vbFalse, vbFalse)
        strYvalore = Replace(Yvalore, ",", ".")
        strRiga = strRiga & "" & "Y" & strYvalore & " "
        Case "Z"                                                    'isolo 
la Z
        Ncifre = Len(matrice(i))
        Zvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Zvalore = FormatNumber(Zvalore, 5, vbTrue, vbFalse, vbFalse)
        strZvalore = Replace(Zvalore, ",", ".")
        strRiga = strRiga & "" & "Z" & strZvalore & " "
        Case "I"                                                    'isolo 
la I
        Ncifre = Len(matrice(i))
        Ivalore = (Val(Right(matrice(i), Ncifre - 1)))
        Ivalore = FormatNumber(Ivalore, 5, vbTrue, vbFalse, vbFalse)
        strIvalore = Replace(Ivalore, ",", ".")
        strRiga = strRiga & "" & "I" & strIvalore & " "
        Case "J"                                                    'isolo 
la J
        Ncifre = Len(matrice(i))
        Jvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Jvalore = FormatNumber(Jvalore, 5, vbTrue, vbFalse, vbFalse)
        strJvalore = Replace(Jvalore, ",", ".")
        strRiga = strRiga & "" & "J" & strJvalore & " "
        Case "K"                                                    'isolo 
la K
        Ncifre = Len(matrice(i))
        Kvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Kvalore = FormatNumber(Kvalore, 5, vbTrue, vbFalse, vbFalse)
        strKvalore = Replace(Kvalore, ",", ".")
        strRiga = strRiga & "" & "K" & strKvalore & " "
        Case "H"                                                    'isolo 
la H
        Ncifre = Len(matrice(i))
        Hvalore = (Val(Right(matrice(i), Ncifre - 1)))
        Hvalore = FormatNumber(Hvalore, 5, vbTrue, vbFalse, vbFalse)
        strHvalore = Replace(Hvalore, ",", ".")
        strRiga = strRiga & "" & "H" & strHvalore & " "
        Case Else                                                   'tutto 
il resto
        strRiga = strRiga & matrice(i) & " "
    End Select
    Next
    Print #2, strRiga
    strRiga = ""
Loop
Close #1
Close #2
Ti ringrazio ancora per la collaborazione.
R.