Autore Topic: Stringa di lunghezza fissa  (Letto 2576 volte)

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Stringa di lunghezza fissa
« il: 03 Dicembre 2010, 20:10:38 »
Oggi mi sono trovato di fronte ad un nuovo quesito.

Devo inserire in un file di testo, di cui ciascuna riga è la concatenazione di stringhe a lunghezza fissa...
Ad esempio:
Num_di_riga(7 caratteri) + Cognome (30 caratteri) + Nome (20 charatteri)...

Ogni campo deve quindi contenere quel numero stabilito di caratteri, sia se la variabile è più corta sia più lunga.

Pensavo di usare: Format(NumRiga, "0000000") + Left(Cognome, 30) + Left (Nome, 20)...

Però quando sono andato a vedere il risultato con un carattere "Monospace", ma se il Cognome o il Nome sono più corti... allora Left non ha effetto, e la variabile viene troncata.

A questo punto ho risolto molto barbaramente aggiungendo per ogni campo n_spazi con space(n) ad ogni variabile... così Left trova delle stringhe più lunghe e le mozza...
Format(NumRiga, "0000000") + Left(Cognome & space(30), 30) + Left (Nome & space(20), 20)...

Così funziona... però ero curioso di sapere se esiste una funzione che imposti direttamente la lunghezza di una stringa sia che la variabile dentro sia più piccola o che sia più lunga...

PS. avrei potuto risolvere più elegantemente anche con una funzione personalizzata che:
a) in caso la variabile sia di lunghezza inferiore alla fissa, calcola la lunghezza della differenza tra fissa e variabile, e la aggiunge in numero di spazi esatti
b) in caso la variabile sia di lunghezza superiore alla fissa, la tagli con Left.
c) in caso di uguaglianza non fa nulla.

Ma non l'ho fatta perché non so se in termini di tempo di calcolo appesantisco il programma... Considerando che possono essere 2000-3000 righe di 250 caratteri ciascuna.
« Ultima modifica: 03 Dicembre 2010, 20:19:02 da perseo »

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Stringa di lunghezza fissa
« Risposta #1 il: 03 Dicembre 2010, 23:43:03 »
Mi son perso leggendo il tuo post...  :rolleyes:

Cmq, partiamo da un concetto: Left e Right servono per "troncare" le stringhe ad una lunghezza prefissata, non per "riempirle" se queste sono più corte. Quindi con Left(variabile, 30) chiedi di prendere i "primi" 30 caratteri a sinistra della stringa. È giusto che se la stringa sia più corta non te la riempia.

Un modo elegante potrebbe essere quello di inserire un controllo sull'effettiva lunghezza della stringa ricevuta:
DIM temp1, stringa AS String

Codice: html [Seleziona]
  IF Len(stringa)<30 THEN
    temp1 = stringa & Space$(30-Len(Stringa))
  ELSE
    temp1 = Left$(Stringa, 30)
  ENDIF


In temp1 hai una stringa lunga esattamente 30 caratteri.
Visita il mio sito personale: http://www.leonardomiliani.com

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Stringa di lunghezza fissa
« Risposta #2 il: 04 Dicembre 2010, 09:57:02 »
Esattamente Leo,
il codice è proprio quello... e mi chiedevo se c'è un modo per verificare se Gambas esegue più velocemente questo codice:

Codice: vb [Seleziona]
IF Len(stringa)<30 THEN  
  temp1 = stringa & Space$(30-Len(Stringa))  
ELSE  
  temp1 = Left$(Stringa, 30)  
ENDIF  



oppure quest'altro:

Codice: vb [Seleziona]
temp1 = Left(stringa & space(30), 30)


Mi ricordo che un mesetto fa mettesti un post proprio per confrontare i tempi di esecuzione di due codici che restituiscono il medesimo risultato...

OT. è più carico il Tag 'code=htlm'. Mi sa tanto che lo adotto...  ;)
« Ultima modifica: 04 Dicembre 2010, 09:58:35 da perseo »

Offline leo72

  • Amministratore
  • Senatore Gambero
  • *****
  • Post: 2.163
    • Mostra profilo
    • http://www.leonardomiliani.com
Re: Stringa di lunghezza fissa
« Risposta #3 il: 04 Dicembre 2010, 10:34:11 »
Beh, per fare una prova non devi far altro che crearti un programma che:

1) registri l'ora del sistema;
2) esegua un ciclo molto elevato in ripetizioni, diciamo 50.000 o 100.000 volte, all'interno del quale eseguire le operazioni richieste;
3) calcolare la differenza fra l'ora di termine del ciclo e l'ora di inizio che hai memorizzato al punto 1).

Ovviamente quello con la differenza minore è anche il codice che viene meglio implementato in Gambas.

O.T.:
Veramente ho sbagliato a cliccare su HTML, dovevo scegliere Gambas (che, come vedi, è proprio sopra). Questo è il risultato con Gambas:

Codice: gambas [Seleziona]
  IF Len(stringa)<30 THEN
    temp1 = stringa & Space$(30-Len(Stringa))
  ELSE
    temp1 = Left$(Stringa, 30)
  ENDIF
Visita il mio sito personale: http://www.leonardomiliani.com

Offline perseo

  • Maestro Gambero
  • ****
  • Post: 264
    • Mostra profilo
Re: Stringa di lunghezza fissa
« Risposta #4 il: 04 Dicembre 2010, 13:21:41 »
Grazie per la spiegazione... poi faccio qualche prova!  ;)

Re-OT.
Non avevo notato che c'era la combo... "evidenzia la sintassi"... Io cliccavo sul tag code e poi aggiungevo a mano il tipo di linguaggio...  :ok:

Codice: gambas [Seleziona]
'Così mi piace molto molto!