Newsgroup: it.comp.lang.visual-basic
Titolo: [?]"Riduzione" di stringa fatta di sole cifre

Lo ammetto, non ce la faccio:
Ho una stringa di sole cifre ("0" to "9") che ha lo scopo di garantirmi un
ordinamento alfanumerico (è infatti un campo di un database oggetto di un
ORDER BY), ma ... è troppo lunga o può diventarlo.
Esempio:
"000010003000001"
"000010003000002"
"000010003100002"
"000020000100001"
Mi sto chiedendo se esiste qualche artificio che permetta di trattare, anche
trasformandoli, tali caratteri/cifre in modo da ottenere una stringa più
breve (insomma, che ne valga la pena) mantenendo queste caratteristiche:
-Le stringhe risultanti devono rispettare l'ordinamento alfabetico di quelle
originali
-Possono contenere qualsiasi carattere (io non ho controindicazioni), ma
senza creare incompatibilità con un campo di database oggetto di ORDER BY,
ammesso che ve ne siano.
Grazie.


visto ch è un numero base 10  trasformalo in base n (visto che puoi usare
tutti i caratteri)
per quanto riguardal'ordinamento credo rimanga invariato
mai provato però :))
ciao

> per quanto riguardal'ordinamento credo rimanga invariato
dubito seriamente...
Ignazio

 dubito seriamente...
Perchè?
Se io converto una serie di valori in hex (per semplicità) ottengo comunque
una serie di valori "alfabeticamente" ordinata.
L'unica cosa a cui stare attenti è il padding: 10 -> (hex)0A e non (hex)A.
Sbaglio?
Ciao

 una serie di valori "alfabeticamente" ordinata.
Se li converto in hex è tutto ok (credo... Non so se 0 venga prima di A), ma
Franco ha parlato di base n. In questo caso, se per esempio scegliamo 256
come base (la scelta migliore per minimizzare lo spazio occupato), dubito
che "a" venga dopo di "B" nell'ordinamento alfabetico, anche se
"numericamente" è così. E comunque come verrebbero ordinati, per esempio,
"à" e "a"? O "è" e "g" (numericamente "è" viene molto dopo)?
IMHO il modo migliore è creare un vettore con tutti i caratteri "permessi",
ordinarlo e costruire una stringa per la corrispondenza tra carattere e
"cifra" associata. Per esempio, se scelgo "3afèd" e VB gli ordina "3adèf"
(non lo so come gli ordina, è un'ipotesi) allora associo a "3" 0, ad "a" 1,
e così via (in generale a X associo instr(vettoreordinato, X)-1) ed utilizzo
questa "tabella" per fare le conversioni.
Ignazio

 "à" e "a"? O "è" e "g" (numericamente "è" viene molto dopo)?
a parte che per n intendevo il massimo possibile e non tanto 256 altriemnti
lo avrei scritto,in quanto ci sono diverse cose da prendere in
considerazione..
1) se il carattere deve essere visibile (in quanto i primi 32 non sempre
potrebbero esserlo ,compreso il 255)
2) se il carattere non deve essere grafico (quelli al di sopra di 128 spesso
lo sono o addirittura non visibili dipende dal carattere usato nella
visualizzazione)
3) si deve prendere anche in considerazione la funzione di ordinamento di
sql.Veramente non so quanto segua la tabella ascii o se prenda in
considerazioni altri parametri..
"base n"  deve seguire tutti questi presupposti non volevo asolutamente dire
256 :)))
256 è il massimo se "order by" ordina in base alla tabella ascii (è da
verificare io non lo so)
giusto per precisare il tutto...
ciao

 questa "tabella" per fare le conversioni.
Oppure semplicemente consigliamo a Lupo di tenersi l'ordinamento corrente
perchè non credo che tutto il suo HD sia in pericolo per l'avvento di quei
numeri.
Suvvia di spazio ce n'hai!!!!!!
:)

 ha scritto nel messaggio
news:41zH8.4092$ie.7...@twister2.libero.it...
Ringrazio tutti per gli interventi e ... preciso (in particolare a Vegeta):
Non ho problemi di spazio fisico, ma me ne ponevo alcuni sulla gestione del
nuovo campo.
Se quel campo deve stare (come deve stare) in ogni movimento di magazzino
per l'intero anno (vabbč, presumibilmente viene usato solo per alcuni tipi
di movimenti e quindi l'occupazione č ridotta), mi ruga doverlo caricare
ogni volta (e non voglio fare una tabella esterna e collegata).
Volevo risparmiare sulle risorse in memoria (e trasferimenti via rete), non
tanto su quelle fisiche su disco.


Ho risolto in modo semplice:
Qualsiasi sia la stringa di numeri da tradurre, viene resa (se di lunghezza
dispari) di lunghezza pari anteponendo uno "0". Poi considero ogni coppia di
caratteri/cifre (a questo punto la stringa sarà fatta di un numero
qualsiasi, ma intero, di coppie, ciascuna che va da "00" a "99") e ... mi
limito a depositare in un singolo carattere/byte (che può contenere un
valore decimale da 0 a 255) il valore numerico complessivo e decimale di
quella coppia.
Allo scopo di evitare/ridurre problemi con la ORDER BY, introduco anche
alcune "correzioni" per ottenere caratteri rappresentabili (parto da
spazio=32) e per evitare i caratteri " (34), ' (39) e quelli oltre ~ (126),
aggiungendo al risultato, rispettivamente, 1, 1 e 98 (ricomincio da "à").
Ho provato con queste semplici istruzioni e tutto funziona.
Ehm..., non mettete il carattere risultante in un listbox sortato.
Chi ha deciso come ordinare i listbox beveva (e questo è risaputo), ma ...
fumava anche strani intrugli di erbe che si originavano dalle muffe del
retro del primo garage di Bill.
    For n = 0 To 99
        x = n + 32
        If x >= 34 Then x = x + 1           'Evito "
        If x >= 39 Then x = x + 1           'Evito '
        If x >= 127 Then x = x + 98     'Evito crt non rappresentabili
(inizio da à)
'            In x ho il numero (0-99) tradotto da usarsi con Chr(x) per
generare
'            un carattere tale da rispettare l'ordinamento alfanumerico
originario. Tombola!
'        ...
    Next n

     Next n
Viene incrementata due volte la x.
Stessa cosa se x all'inizio è già maggiore di 128. Viene incrementata 3
volte.
Va bene così? O è un errore?

 Va bene così? O è un errore?
Va bene così, in tal modo, oltre alla *necessaria* corrispondenza alfabetica
(anche se "discontinua"), si ottiene che ogni numero (0-99) corrisponda a un
carattere diverso e, inoltre, è possibile "decodificare" il carattere stesso
per ottenerne la coppia di numeri originaria.

 Va bene così? O è un errore?
Va bene così, in tal modo, oltre alla *necessaria* corrispondenza alfabetica


 256 :)))
Ma "base n" sottointende che 1<n<=256! Come ho detto prima, ho preso il caso
limite per dimostrare che non funzionava.
Ignazio

 limite per dimostrare che non funzionava.
Che poi è il metodo che si usa in matematica per verificare l'andamento
delle funzioni: si considerano i punti "limite", gli altri anno
comportamenti irrilevanti ("irrilevanti" è da leggersi in senso lato).
Ciao

 limite per dimostrare che non funzionava.
adesso dilungarci su questa cosa........
non potendo dare una base precisa dovevo pur dare una base ....
non devi prendere valori assoluti devi prendere quei valori che sql ti
permette :))
Il senso del discorso si basava nel dire  visto che si trattava di un numero
decimale si poteva prendere in considerazione l'uso di numeri in basi
diverse(come penso lupo conosca ).
ciao :)

 diverse(come penso lupo conosca ).
Mi piace questa discussione, anche se ho già risolto in modo ...
semplicissimo. (Si veda un mio post in questo topic)

 semplicissimo. (Si veda un mio post in questo topic)
ahhahah
cmq hai usato un base 100 rimpicciolito potevi fare di meglio :)) la
soluzione consigliata da neclepsio ocn il vettore ottimizza l'algoritmo in
maniera migliore :))
ciao

 ha scritto nel messaggio
news:rH7I8.11733$ie.2...@twister2.libero.it...

Non direi. Non dimenticare che lo scopo principale era quello di ottenere
una stringa più corta, da depositare sul database. La "mia" stringa è
esattamente la metà di quella originaria.

 esattamente la metà di quella originaria
usando un base 100 (visto che prendi un numero a coppie) e ottieni il 50%
,usando un base 200 (ipotetico numeri di caratteri della tabella di
ordinamento sql) di conseguenza avrai ancora un'ulteriore riduzione del 50%
, ricorda che stai riducendo un numero decimale :))
ciao

 ha scritto nel messaggio
news:YV7I8.13256$8x3.2...@twister1.libero.it...

In questo senso, hai ragione, ma non posso/voglio usare tutti i 256
caratteri per evitare problemi...

 caratteri per evitare problemi...
però ti perdi un po :)))
per concludere (altriemnti s'arrabbiano qui qui :)))  semmai volessi usare
questo algoritmo ti è stato appunto consigliato(sempre il solito neclepsio)
di usare un array dove inserirai i caratteri permessi in ordine giusto :))))
ciao :)

 ordinamento sql) di conseguenza avrai ancora un'ulteriore riduzione del
50%
Per niente!
Non avrebbe alcun vantaggio ad usare una "base" (intesa come la sopracitata
b100) 200, se non un garbuglio nel codice.
Il passo successivo sarebbe dovuto essere raggruppare 3 cifre in una, ma un
byte arriva a 256 e non a 999, quindi più un là del 100 non si può andare :)
Secondo la tua logica basterebbe usare una """base""" (100*(numero cifre /
2)) per comprimere un numero in una sola cifra, ma questo è impensabile,
sempre perchè abbiamo il limite fisico del 255.
Ciao

 byte arriva a 256 e non a 999, quindi più un là del 100 non si può andare
:)
:)))))))))))))))))))))))
quarda che il numero in stringa va convertito in long :)))) e non prendendo
3 caratteri alla volta e di conseguenza dopo verrebbe visualizzato in
stringa...
Un pochino di matematica però non ti farebbe male ehehheh
senza offesa...

 stringa...
Franco, non ho ben capito: Cos'è che viene convertito in long?
Questa stringa, per esempio:
"18663815008466895827284616531525542142532536476475875...etc" ?
E il mantenimento dell'ordinamento alfanumerico fra stringhe diverse?

 E il mantenimento dell'ordinamento alfanumerico fra stringhe diverse?
ho capito una cosa .......
che non mi so spiegare per nulla :))
alzo le braccia e mi arrendo :))))
scusa colpa mia...

 scusa colpa mia...
Non è questione di "colpa", ci mancherebbe. Volevo solo capire...

 E il mantenimento dell'ordinamento alfanumerico fra stringhe diverse?
è smerpe la solita storia del vettore :)))