Newsgroup: it.comp.lang.visual-basic
Titolo: Estarre una stringa MOLTO COMPLICATO.... POST 3 LE MACCHINE RIBELLI

mmm
Ragazzi,
Grazie a tutti...
Scusate se non sono stato spiegato..
Questa funzione andra a fare parte di una dll per una pagina ASP che
simulerà il datagrid in 
asp.net
 (+ o -)
Purtroppo se uno utilizza un Alias per il campo della chiave primaria
mi genera un errore..
Così io intendo creare una funzione che mi restituisca(conoscendo la
stringa sql completa, ed il nome della chiave primaria) l'alias
eventualmente utilizzato per la chiave primaria..
"Select pippo as Nome, chiaveprimaria as gianni from tabella"
Ho la stringa completa, ho chiaveprimaria voglio gianni
                                                   Grazie ^_^
                                                     luigi
termopilucco aveva fatto un buon lavoro ma io aggiungendo il suo pezzo
di codice mi sono reso conto di avere utilizzato delle premesse
sbagliate..

 sbagliate..
e il codice che ti hanno passato gli altri, invece, come va?
--
Salutoni
Sergio
per rispondere... togli il group dall'indirizzo

 e il codice che ti hanno passato gli altri, invece, come va?
Temo che non lo sapremo mai. Più probabile trovare il quarto topic...
Comunque, visti gli scopi, credo che un AS sia solo il primo ostacolo...
Indicherei VBP0PSQL sul SC, cercando "Parser" (il nome del file non si
trova, nemmeno con la Full Text)

 Temo che non lo sapremo mai. Piů probabile trovare il quarto topic...


ormai è finito (tranne questo dettaglio...)
ricapitolando:
- se dato il campo vuoi l'alias, prendi le risposte al tuo secondo
messaggio, che per quanto mi risulta funzionano
- se dato l'alias vuoi il campo, prendi la risposta di termopilucco, ma
ricorda che devi integrare ulteriormente il codice, perche' per esempio non
funziona se non c'e' una spaziatura esatta, come in questa stringa
perfettamente lecita
"Select pippo as Nome,chiaveprimaria as gianni from tabella"
Come vedi hai entrambe le soluzioni; se sono a prova di bomba con qualsiasi
SELECT non lo so, fai le tue prove, scegli quella piu' adatta e aggiustala
di conseguenza.
Ciao
-- 
Luca Dormio - 
luca....@tin.it
________________________________
"Marty, non stai ragionando in maniera quadridimensionale"
Dr. Emmett L. Brown

 L'esempio di Lupo e il mio fanno invece quello che sembri chiedere
adesso...
E io ritengo la mia soluzione ancora la più pulita e semplice, fa quello che
vuoi da una parte o dall'altra e la spaziatura inesatta non è un problema se
sulla stringa si fa un preventivo
Do While InStr(stringa, "  ") > 0
    stringa = Replace(stringa, "  ", " ")
Loop
:)
Ciao
--
Math Parser : 
http://www.neodatatype.net
Sito Comune : 
http://www.it-lang-vb.net

 ormai č finito (tranne questo dettaglio...)
Come dicevo nel post sopra, visto quello che pare essere lo scopo
(Mini-Parser SQL o qualcosa del genere), credo che l'ostacolo dell'AS sia
solo il primo e uno dei piů abbordabili...

 Ciao

 simile alla mia. Io sono l'unico a gestire le quadre. Ciapalè! ;-)
No, mi scuso, Luca gestisce correttamente le quadre (le ignora, ma recupera
il nome del campo lungo con le stesse, ma non gestisce il "from", gestisce
il "FROM" :-P
Ri-Ciapalè! ;-)

 nel senso che ha fatto il diagramma di flusso, ma non il programmillo
Sì, perchè data la semplicità dell'algoritmo, una persona seria se la
sarebbe "tradotta" per conto suo.
Dato che la prima impressione non è stata positiva ho dato la mia in questo
modo per vedere se mi sbagliavo, infatti l'unica risposta presa in
considerazione è stata quella che ha richiesto meno sforzo mentale.


 mentale.
In tal senso, d'accordo, e, come vedi, ... ho già dato.

 Loop
Mai detto che non vada bene lo split, solo che non e' cosi' immediato come
sembra.
Il codice qui sopra, per esempio, copre solo un caso particolare; come gia'
ripetuto devi anche considerare quello in cui *non* ci sono spazi tra le
virgole che separano i campi:
SELECT Campo1 As Alias1,Campo2 As Alias2 FROM TABELLA
quindi dovresti come minimo fare (come c'e' anche nel codice di lupo)
stringa = Replace(stringa, ",", " , ")
Do While InStr(stringa, "  ") > 0
    stringa = Replace(stringa, "  ", " ")
Loop
non solo, considera quest'altra stringa:
SELECT [Nome Lungo] As Alias FROM TABELLA
penso ti sia evidente il problema...



Maledetto Carter, mi hai fregato anche stavolta!
Ebbene si, manca un vbTextCompare nel primo InStr ;-)


 Ciao

 Select pippo as [nome campo con spazi] from tabella
hai ragione.
In questo caso occorreva aggiungere il controllo sulle quadre:
se il "token" dopo "AS" iniziava per "[" occorre giuntarlo al successivo
fino a trovare quello terminante per "]".
Una funzione cosě si risolve con una ventina di righe, e senza gli odiosi
InStr().


 Una funzione cosě si risolve con una ventina di righe, e senza gli odiosi
InStr().
... che io, invece, amo... ;-)
ViveLaDifference!

 ha scritto nel messaggio
news:bo07vv$150hna$1...@ID-174464.news.uni-berlin.de...

Veramente Luigi conosce il valore *a sinistra* dell'AS (il campo) e vuole
quello a destra (l'alias), quindi "[Nome Lungo] AS" nell'array risulta
spezzato il 3 elementi e non viene trovato; comunque che lo spazio sia nel
nome o nell'alias il problema dello Split rimane il medesimo...


 medesimo...
Certo, ma mi riferivo all'esempio che tu avevi fatto in risposta a Zanna (le
prime righe quotate di questo post).
Siccome Zanna dice che prima cerca il nome del campo (che si ipotizza
passato fra quadre, se presenti/dovute) e poi cerca AS seguente, non avrebbe
problemi nell'esempio che hai fatto a cercare il nome del campo, ma ne
avrebbe, nell'esempio successivo che mi sono permesso di ipotizzare, a
cercare, dopo aver trovato campo e AS seguente, il nome dell'alias se questo
contiene spazi. Del resto, Zanna ha già convenuto che alla Split, proprio in
base a quest'ultimo esempio, dovrebbe aggiungere qualche test...

 problemi nell'esempio che hai fatto a cercare il nome del campo
Non ci capiamo:
con lo split sulla select di cui sopra si otterrebbe
Array(0) = "SELECT"
Array(1) = "[Nome"
Array(2) = "Lungo]"
Array(3) = "AS"
Array(4) = "Alias"
ecc... dato che la ricerca del campo che intendeva Zanna era un ciclo
sull'array, non utilizzando InStr e soci, come vedi di problemi a trovare il
campo ne avrebbe eccome...


 InStr().
Ma se le quadre le hai dall'altra parte del "AS" non troverai mai la stringa
che cerchi nell'array e ce l'hai in saccoccia comunque...se con qualche
InStr scansi questi problemi e te la cavi in una decina di righe, ben venga


 Ciao

 InStr scansi questi problemi e te la cavi in una decina di righe, ben
venga
In effetti la cosa è più complessa di quanto appare a prima vista.
A questo punto credo che la cosa migliore sia riagionare come i parser
"seri".
Un loop su ogni carattere della riga e con un select case ragionare di
conseguenza.
Alla fine è tutto risulta più pulito, lineare e anche più semplice di quanto
sembri.
(p.s.: il mio parser in firma funziona così)


 campo ne avrebbe eccome...
Questo l'avevo spiegato più su.
nel caso mi accorgo che Array(i) inizia con "[" lo giunto ai seguenti finchè
Array(i) non termina con "]".
Giustamente il problema sorge con i separatori diversi da ",".
Però c'è anche da considerare casi come questo:
SELECT "pippo as campo" AS campo FROM...
Come la mettiamo? :)
Anche per questo ho già risposto pochi post più in su.


Questi post hanno ottenuto quasi 50 risposte...
Ed io tranne quello di termopilucco che funziona (ma fa l'inverso di
quello che avevo chiesto poiché come uno stupido io ho utilizzato
premesse sbaglaite)
non sono riuscito ad ottenere nulla..(o mi è sfuggita.. ma sono cosi
intricati i post successivi)
Se qualcuno ha pietà di me e mi manda un pezzo di codice :(
Che magari supporti anche le parentesi []
Come ripeto
"Select pippo as Nome, chiaveprimaria as gianni from tabella"
Ho la stringa completa, ho chiaveprimaria voglio gianni..

 Ho la stringa completa, ho chiaveprimaria voglio gianni..
Fai così:
Un loop su ogni carattere delle stringa,
Se il carattere è diverso da " " o "," allora Stringa = Stringa & Carattere
altrimenti
Se il carattere è "[" fai un loop che avanza sulla stringa e
faccia Stringa = Stringa & Carattere fino a che Carattere <> "]" e
ti salvi Stringa nell'array Stringhe() e Stringa = "",
altrimenti ti salvi direttamente Stringa nell'array Stringhe()
Devi stare attento alle stringhe, quindi a " e ', nel caso Carattere sia " o
' devi comportarti come per "[", considerando che potrebbero esserci doppie
virgolette oppure espressioni tipo "ciao " + nome.
Qui lascio a te il gusto delle sperimentazioni. :)
Alla fine puoi utilizzare il sistema che avevo spiegato in precedenza:
Un loop su Stringhe e controllare se ce n'è qualcuna con "AS"
E questi sono i miei ultimi 2cents sull'argomento: sono già fuori budget.


 Se qualcuno ha pietà di me e mi manda un pezzo di codice :(
Abbiamo gia' avuto pieta' e abbiamo gia' mandato parecchio codice; il minimo
che potresti fare pero' e' almeno sforzarti di leggere attentamente le
risposte che ti vengono fornite
nel tuo secondo post del 30/11 c'erano come minimo 2 routine gia' fatte piu'
altri suggerimenti validi, ci sono non piu' di 12 risposte in tutto, valle a
rivedere e troverai quello che cerchi.


 E questi sono i miei ultimi 2cents sull'argomento: sono già fuori budget.
A questo punto direi che sull'argomento l'abbiamo sforato tutti


 e Instr che li scansi come la peste? ;-)
La mid niente, anzi, mi č simpatica :)
Un po' lenta a dire il vero, infatti per dei loop tipo quelli sopracitati
spesso preferisco fare un
bytes = strConv(stringa, vbFromUnicode)
For i = 0 to ubound(bytes)
    if Asc(bytes(i) = ...
...
decisamente (anzi, *sbalorditivamente*) piů performante.
L'instr invece la uso solo quando non se ne puň fare a meno, perchč mi vien
male pensare che devo sempre verificarne il risultato:
p = Instr(stringa, substringa)
if (p > 0) then
    stringa = mid(stringa,p)
else
    stringa = ""
endif
Se le sottostringhe diventano due o piů sulla stessa stringa, i rami dell'if
da controllare crescono esponenzialmente, e io amo il codice compatto.
:)


 Questi post hanno ottenuto quasi 50 risposte...

Senti, accomodati, lontano, molto lontano da me. Addio.

 Loop
Ho creato uno statement SQL molto bastardo (e realmente possibile) che manda
all'aria (credo, non ho provato) tutte le soluzioni fornite:
"SELECT [A AS  FROM] AS  [A SELECT   AS  FROM  ] FROM test;"
In questo caso fallirebbero:
-Split sullo spazio (c'è nei nomi dei campi ed è anche doppio).
-Split su "AS"
-Split su "FROM"
L'unica soluzione che vedo è un noioso parsing con tante IF oppure l'uso di
REGEXP furbe.
In Perl si potrebbe fare in una riga, in Python invece basta invocare la
funzione Estarre_una_stringa_MOLTO_COMPLICATO()
<x:termoPilucco>

 funzione Estarre_una_stringa_MOLTO_COMPLICATO()
un unico, grande, immenso MEGA-ROFTL !!!!!!
good python-coding!!
-- 
Alletun
Sorry, ask me if you want to get my e-mail!