Autore Topic: Ricavare valori da una stringa  (Letto 971 volte)

Offline nello79

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Ricavare valori da una stringa
« il: 02 Febbraio 2012, 00:39:01 »
Da una stringa così:
X100Y50
come faccio a ricavare i valori di x e y singolarmente?
Da considerare che potrebbero esserci anche stringhe scritte così:
N100X100Y50

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #1 il: 02 Febbraio 2012, 04:43:01 »
Da una stringa così:
X100Y50
come faccio a ricavare i valori di x e y singolarmente?
Da considerare che potrebbero esserci anche stringhe scritte così:
N100X100Y50

La lunghezza di una stringa o la complessità della composizione dei caratteri non è un problema.

Qui tu forse per "valori" vuoi intendere i numeri che seguono le due lettere " X " e " Y "....

allora, se le cifre che compongono i due valori sono note (nel senso che se già sai che la X ha un valore che non supera le centinaia, e la Y un valore che non supera le decine, potresti fare così:
Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim a As Integer    ' porremo il primo risultato nella variabile " a "
  Dim b As Integer    ' porremo il secondo risultato nella variabile " b "


    a = Val(Mid$("X100Y50", 2, 3))     ' raccoglie "tre" caratteri cominciando dal 2° a sinistra.... cioè  " 100 ", e converte il risultato in un numero
  
    b = Val(Right$("X100Y50", 2))    ' raccoglie i primi "due" caratteri a destra della stringa.... cioè " 50 ", e converte il risultato in un numero
  
      Print a, b     ' va a mostrare in console i due risultati: 100  e  50

End


La conversione da Stringa ad Integer non è obbligatoria: dipende ovviamente dal successivo uso che devi fare di ciascun risultato.
Quella funzione Mid$ puoi leggerla, volendo, anche così: "Della stringa "X100Y50", partendo dal 2° carattere a sinistra, prendo 3 caratteri !"
 :)


Se invece i valori possono essere composti da qualunque numero di cifre, allora il discorso cambia !
Provo ad esporre un metodo di soluzione fra altri possibili.
Quello che senz'altro è noto, è che il primo carattere (a partire da sinistra) della stringa è certamente la lettera "X", la quale quindi non entrerà a far parte del suo valore. La prima cifra utile sarà certamente il secondo carattere della stringa... ma non sappiamo se il valore è rappresentato dalla sola cifra delle unità, oppure se v'è anche un'altra cifra (quella delle decine), ed un'altra ancora (quella delle centinaia), e così via.
Procediamo così:

Codice: gambas [Seleziona]

Public Sub Button1_Click()

    Dim a As String[]
  
    ' tronco la stringa in due sotto-stringhe, ed elimino la "Y" che utilmente mi fa anche da "separatrice" fra i due valori:
  a = Split("X100Y50", "Y")

  '  A questo punto, la prima sotto-stringa è contenuta nella variabile stringa[]: a[0], mentre la seconda sotto-stringa in: a[1].
  ' Della prima sotto-stringa (contenuta nella variabile a[0]) prendo un numero di caratteri pari alla totale lunghezza della sotto-stringa medesima
  ' (pongo genericamente la "totale" lunghezza della sotto-stringa, perché io non conosco quanto è lunga, cioè di quante cifre è composta), ma....
  ' ...ma in vero non prendo proprio tutti i caratteri, perché parto dal 2° carattere a sinistra (lo faccio per escludere la "X");
  ' e mostro il risultato in console:
  Print "X = "; Mid$(a[0], 2, Len(a[0]))

  ' mostro, infine, il risultato in console della seconda sotto-stringa, già priva della "Y":
  Print "Y = "; a[1]

End
« Ultima modifica: 17 Marzo 2013, 02:14:35 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #2 il: 02 Febbraio 2012, 09:27:36 »
i metodi sono molteplici puoi anche fare in questo modo:

Codice: [Seleziona]
controlli se esiste il carattere che indica la presenza del dato:
Dim pn, px, py, n, x, y As Integer
  Dim stringa As String
 
  stringa = "N100X200Y300"
  pn = InStr(stringa, "N")
  px = InStr(stringa, "X")
  py = InStr(stringa, "Y")
 
  If pn <> 0 Then 'il carattere N esiste
    N = Val(Mid(stringa, pn + 1, px - pn - 1))
  Endif
 
  x = Val(Mid(stringa, px + 1, py - px - 1))
  y = Val(Mid(stringa, py + 1, (Len(stringa) - py)))
 
  Print n
  Print x
  Print y

in questo modo i alori di n posso esserci o non esserci, inoltre il numero di cifre dei valori possono avere un qualsiasi numero

Offline nello79

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #3 il: 02 Febbraio 2012, 10:01:16 »
Ok credo che la soluzione di fsurfing si avvicini meglio al mio problema in quanto la variabile N può non esserci ma al suo posto potrei trovare una variabile G oppure potrei trovare entrambi o nessuno. Per quanto riguarda i valori di X e Y ho dimenticato di dire che hanno anche uno o due e in alcuni casi anche tre decimali, mi confermi che assegnando le variabili X e Y come float funziona anche con i decimali?

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #4 il: 02 Febbraio 2012, 13:08:32 »
si solo che al posto di val() devi usare cfloat() e fare attenzione al punto decimale , se non sbaglio gambas richiede un "." se è presente una virgola devi procedere alla sostituzione con un replace

stringa=replace(stringa,",",".")

il fatto che ci sia un g o n  o entrambi devi solo implementarlo nel codice

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #5 il: 02 Febbraio 2012, 17:02:27 »
i metodi sono molteplici puoi anche fare in questo modo:

Il mio caro amico fsurfing  :ciao: ha preso in esame il caso più difficile con la stringa: "N100X200Y300" .

Voglio provarci anch'io, utilizzando il metodo da me sopra esposto:

Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim a As String[]
  
     a = Split("N100X200Y300", "X" & "Y")

 ' vado semplicemente a vedere i risultati:
    Print "N = "; Mid$(a[0], 2, Len(a[0]))    '  qui puoi anche fare così:  Replace$(a[0], "N", "")
    Print "X = "; a[1]
    Print "Y = "; a[2]

End



... la variabile N può non esserci ma al suo posto potrei trovare una variabile G ... o nessuno.
Poniamo dunque questa eventualità.

Codice: gambas [Seleziona]

Public Sub Button1_Click()

  Dim a As String[]
  Dim b, c As String
  
    ' la variabile "b" conterrà la stringa, nella quale sappiamo solo
    ' che sono certamente presenti i caratteri "X" ed "Y", ma non sappiamo
    ' se c'è - ed eventualmente quale sia - all'inizio un carattere alfabetico "diverso" (N o G) da "X" ed "Y".
    ' Qui per ovvi fini esplicativi la stringa è nota:
    b = "N100X200Y300"
    
    ' ricaviamo la prima lettera della stringa:
    c = Left$(b, 1)
  
  If c < Chr(88) Then          ' se la prima lettera non è "X" né "Y", allora...
     a = Split(b, "X" & "Y")   '...avremo 3 sotto-stringhe e porremo "X" ed "Y" come termini "separatori"

   ' mostriamo i risultati:
    Print c & " = "; Replace$(a[0], c, "")   ' eliminiamo il primo carattere dal valore della prima sotto-stringa, ma lo riproponiamo solo come termine di eguaglianza
    Print "X = "; a[1]
    Print "Y = "; a[2]

 ' se, invece, il primo carattere è la "X" o la "Y", allora...
  Else
    a = Split(b, "Y")   '...avremo solo due sotto-stringhe e porremo "Y" come termine "separatore"

  ' mostriamo in console i risultati:
    Print "X = "; Replace$(a[0], c, "")  ' eliminiamo il primo carattere dal valore della prima sotto-stringa, ma lo riproponiamo solo come termine di eguaglianza
    Print "Y = "; a[1]

  Endif

End
« Ultima modifica: 17 Marzo 2013, 02:15:45 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nello79

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #6 il: 02 Febbraio 2012, 23:56:36 »
Non so come ringraziarvi per l'aiuto che mi state dando tutti e due  :ok: . Allora senza nulla togliere alla soluzione di vuott ma quella di fsurfing la vedo più intuitiva per me che sono alle prime armi con la programmazione. La soluzione di vuott la vedo più complessa in quanto ci sono ancora altri tipi di stringhe da testare e in più avevo dimenticato di dire che nelle stringhe potrebbero anche esserci degli spazi ad esempio N100 X200 Y300, non so se la soluzione di vuott funziona perché non l'ho provata ma quella di fsurfing funziona perfettamente. Ed altra cosa importante la stringa potrebbe avere anche un solo dato ad esempio X200 e basta e in questo caso devo migliorare la soluzione di fsurfing, sempre che ci riesca  :-[ .

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #7 il: 03 Febbraio 2012, 01:08:28 »
... ma quella di fsurfing funziona perfettamente.

fsurfing è uno del gruppo dei migliori  :coder: in questo forum.



Ed altra cosa importante la stringa potrebbe avere anche un solo dato ad esempio X200 e basta .
...forse dovrai far verificare al tuo programma innanzitutto di quanti dati è formata la stringa (credo sia importante non tanto quanto è lunga la stringa, ma di quanti dati specifici è composta).
Più o meno una cosa del genere:  :-[
Codice: gambas [Seleziona]

c[20, 100] As String
g[100] As String

Public Sub Button1_Click()

  Dim a, d, e As Integer
  Dim b As String

    b = "G5N10X200Y3000"   ' facciamo finta che la stringa (avente una quantità di dati specifici a noi non conosciuta) sia questa

    For a = 1 To Len(b)   ' cominciamo una verifica "passo-passo"...
      g[a] = Mid$(b, a, 1)   '...di ciascun carattere presente nella stringa

      Select Case g[a]
        Case "A" To "Z"   ' se il carattere è alfabetico, allora...
          If d > 0 Then
            Print g[d] & " = " & c[d, e]   ' mostra i risultati (tranne l'ultimo)
          Endif
          Inc d
          g[d] = g[a]
        Case Else      ' caso in cui il carattere è numerico:
          Inc e
          c[d, e] = c[d, e - 1] & g[a]
      End Select

    Next


  Print g[d] & " = " & c[d, e]   ' Alla fine viene mostrato anche l'ultimo dei risultati

End
« Ultima modifica: 17 Marzo 2013, 02:16:03 da vuott »
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline nello79

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #8 il: 03 Febbraio 2012, 20:54:32 »
Questa è una buona idea sopratutto per una verifica di sintassi in quanto ogni stringa deve avere solo un valore di G uno di X e uno di Y.

Offline fsurfing

  • Moderatore
  • Senatore Gambero
  • *****
  • Post: 2.482
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #9 il: 03 Febbraio 2012, 21:06:30 »
Citazione
fsurfing è uno del gruppo dei migliori  coder in questo forum.
se scrivi queste cose poi mi commuovo!

Citazione
Questa è una buona idea sopratutto per una verifica di sintassi in quanto ogni stringa deve avere solo un valore di G uno di X e uno di Y.
una domenda mi sorge spontanea.... ma da dove arriva questa stringa? se è un risultato di un processo tuo , sicuramente puoi trovare un metodo migliore per inviare i dati

Offline nello79

  • Gamberetto
  • *
  • Post: 35
    • Mostra profilo
Re: Ricavare valori da una stringa
« Risposta #10 il: 04 Febbraio 2012, 00:38:43 »
No no al momento non è un risultato di un mio processo ma di un altro programma che genera quel file. Teoricamente errori non dovrebbero esserci ma non si sa mai... ho visto spesso programmi che di tanto in tanto davano i numeri ad esempio saltando dei valori o cose del genere e poi comunque serve sempre ad imparare cose nuove :)