posts - 30, comments - 0, trackbacks - 4

importa file di testo delimitati

Molto spesso capita di dover utilizzare degli archivi esterni in formato testo, se questi file sono delimitati, i campi sono divisi da un carattere, con questa procedura siamo in grado di caricarli e quindi gestirli a piacimento.

Per provare la procedura vi allego il file SUPERENALOTTO.csv contenente tutte le estrazioni del SuperEnalotto dal 2000 a oggi.

 

Option Explicit 'Questa istruzione è di fondamentale importanza perchè ci costringe a dichiarare tutte le variabili, anche se può sembrare strano ci semplifica la vita ed evita di nominare Santi e Madonne.

 

 

Private Sub NomeTuaSub()

'iniziamo con le dichiarazioni io normalmente uso queste regole:

  1. divido le variabili in base al tipo.
  2. Faccio precedere ogni variabile con un prefisso in base al tipo di dati che conterranno.  Vedi all. 1
  3. Assegno alle variabili dei nomi che fanno capire cosa contengono
  4. Utilizzo il primo carattere maiuscolo e il resto minuscolo (maiuscoletto).
  5. nell’allegato 2 potete trovare un elenco dei tipi di Variabili gestibili da VBA.

 

 

Dim NL_NumeroRighe, NL_A As Long

 

Dim NI_Z, NI_P, NI_S, NI_K As Integer

Dim NI_NumeroColonne As Integer

Dim NI_Lungo As Integer

Dim NI_Posizione(256) As Integer

Dim NI_LunghezzaCampo As Integer

Dim NI_PosizionePar As Integer

 

Dim ST_FileInput As String

Dim ST_TextLine As String

Dim ST_ArchivioDati() As String

Dim ST_Message, ST_Titolo, ST_Default, ST_Separatore As String

 

ST_Message = " Scegli Il Carattere del ST_Separatore dei Campi nel file csv " ' Imposta il Messaggio.

ST_Titolo = " Inserisci Il Carattere del ST_Separatore "  ' Imposta il Titolo.

ST_Default = ";" ' Separatore di standard ";"

ST_Separatore = InputBox(ST_Message, ST_Titolo, ST_Default) ' fà comparire la finestra per inserire il separatore

If ST_Separatore = "" Then ST_Separatore = ";" ' imposta il Separatore a " ; " se non viene inserito nessun carattere

‘La prossima istruzione apre la maschera di windows “Apri File”

 

ST_FileInput = Application.GetOpenFilename(fileFilter:="File CSV(*.csv), *.csv")

'################################################################################

‘A questo punto no sappiamo quante righe e quante colonne vi sono nel file quindi con le prossime istruzioni controlliamo i due dati.

 

'conta quante righe o "Record" ci sono ------------------------------------------

Open ST_FileInput For Input As #1 ' Apre il file.

For NL_A = 1 To 999000

If EOF(1) Then ' se trova la fine del file imposta quante righe ha contato ed esce dal ciclo for

NL_NumeroRighe = NL_A

Exit For

Else

Line Input #1, ST_TextLine ' Assegna la riga a una variabile.

End If

Next NL_A

Close #1 'Chiudo il file CSV

 

'################################################################################

'conta quante Colonne  "Campi" ci sono ------------------------------------------

Open ST_FileInput For Input As #1 ' Apre il file.

Line Input #1, ST_TextLine ' Assegna la riga a una variabile.

NI_S = 1 ' Riporto a 1 l'indice del numero dei campi

NI_Lungo = Len(ST_TextLine) 'controllo quanto e lunga la riga "stringa"

For NI_P = 1 To NI_Lungo 'scorro un carattere alla volta

If Mid(ST_TextLine, NI_P, 1) = ST_Separatore Then 'Se il carattere in esame  e uguale al ST_Separatore impostato

NI_S = NI_S + 1 'incremento il puntatore

End If

Next NI_P

NI_NumeroColonne = NI_S 'ora sappiamo quante colonne ci sono nel nostro file

Close #1 'Chiudo il file CSV

'################################################################################

'esce se non trova il carattere Separatore impostato

If NI_NumeroColonne = 1 Then

MsgBox " non sono stati trovati separatori  - " & ST_Separatore & " - "

Exit Sub

End If

 

'################################################################################

'Dimensiona la matrice che conterrà i dati -----------------------------------

ReDim ST_ArchivioDati(NL_NumeroRighe, NI_NumeroColonne)

'################################################################################

 

'Carica le righe e controlla dove sono i separatori--------------------------

Open ST_FileInput For Input As #1 ' Apre il file.

For NL_A = 1 To NL_NumeroRighe - 1

Line Input #1, ST_TextLine ' Assegna la riga a una variabile.

NI_S = 1 ' Riporto a 1 l'indice del numero dei campi

NI_Lungo = Len(ST_TextLine) 'controllo quanto e lunga la riga "stringa"

For NI_P = 1 To NI_Lungo 'scorro un carattere alla volta

If Mid(ST_TextLine, NI_P, 1) = ST_Separatore Then   'Se il carattere in esame  e uguale al Separatore impostato

NI_Posizione(NI_S) = NI_P 'memorizzo la Posizione

NI_S = NI_S + 1 'incremento il puntatore

End If

Next NI_P

NI_Posizione(NI_S) = NI_Lungo

 

'Sapendo dove si trovano i separatori si possono estrarre i dati ------------------

NI_Z = 1

For NI_K = 1 To NI_NumeroColonne ' ciclo fino alla fine delle colonne

NI_LunghezzaCampo = NI_Posizione(NI_K) - (NI_Posizione(NI_K - 1) + 1) 'calcolo quanto è Lungo il campo

NI_PosizionePar = NI_Posizione(NI_K) - NI_LunghezzaCampo 'punto in cui parte il campo

' sapendo dove inizia e quanto è Lungo il campo inserisco il campo all'interno della matrice

ST_ArchivioDati(NL_A, NI_Z) = Mid(ST_TextLine, NI_PosizionePar, NI_LunghezzaCampo)

NI_Z = NI_Z + 1 'incremento il puntatore

Next NI_K

Next NL_A

Close #1 'Chiudo il file CSV

 

 

 

 

'################################################################################

'Segnalo qunte righe e qunte colonne ci sono nel file

MsgBox " ho finito di caricare i dati ho caricato N." & NI_NumeroColonne - 1 _

& " Colonne è N." & NL_NumeroRighe & " Righe."

 

' Con questa istruzione vengono visualizzate il numero di righe e il numero di colonne che sono presenti nel file importato.

 

'################################################################################

 

'A questo punto cosa facciamo ?

'avete due possibilità:

 

'1) Usate la fantasia e inserite in questo punto il codice che manipola

    'la matrice ST_ArchivioDati(NL_NumeroRighe, NI_NumeroColonne)

   

'2) Aspettate il prossimo progetto tra 15 Giorni che utilizzerà questo codice

    'per fare qualcosa di utile??????

   

'3) Provate queste semplici istruzioni che fanno vedere in sequenza tutte le linee presenti nel file in esame

' se optate per questa terza scelta eliminate i caratteri ' all’inizio  delle prossime 7 righe di codice

 

'For NL_A = 1 To NL_NumeroRighe - 1 ' ciclo fino alla fine delle righe

'ST_TextLine = ""

'For NI_K = 1 To NI_NumeroColonne ' ciclo fino alla fine delle colonne

'ST_TextLine = ST_TextLine & "   |   " & ST_ArchivioDati(NL_A, NI_K)

'Next NI_K

'MsgBox ST_TextLine

'Next NL_A

 

 

End Sub 'Fine NomeTuaSub

 

 

Allegato 1

 

Prefisso

Tipo variabile

Occ.  Memoria byte

BO

Boolean

2

NB

Byte

1

NC

Currency

8

NDE

Decimal

12

NDO

Double

8

NI

Integer

2

NL

Long

4

NSI

Single

4

OB

Object

4

DA

Date

8

ST

String

 

VA

Variant

16-22

DF

Type

 

 

 

Allegato 2

 

 

·          BO - Le variabili di tipo Boolean sono memorizzate come numeri a 16 bit (2 byte) e possono essere solo True o False

 

·          NB - Le variabili di tipo Byte sono archiviate come unità da 8 bit (1 byte) singole e senza segno in un intervallo compreso tra 0 e 255.

 

·          NC - Le variabili di tipo Currency sono memorizzate come numeri a 64 bit (8 byte) in formato intero, divise per 10.000 in modo da ottenere un numero a virgola fissa con 15 cifre alla sinistra della virgola decimale e 4 cifre alla sua destra. Con questa rappresentazione è possibile specificare un intervallo compreso tra -922.337.203.685.477,5808 e 922.337.203.685.477,5807

 

·          NDE - Le variabili di tipo Decimal sono memorizzate come numeri interi senza segno di 96 bit (12 byte) divisi per una potenza di 10 variabile. La potenza di 10 per cui viene diviso il numero corrisponde al numero di cifre a destra della virgola ed è compresa nell'intervallo fra 0 e 28. Se il fattore di divisione è 0 (nessun decimale), il valore maggiore possibile è +/-79.228.162.514.264.337.593.543.950.335. Con 28 decimali, il valore maggiore è +/-7,9228162514264337593543950335 e il valore minore, diverso da zero, è +/-0,0000000000000000000000000001.

 

·          NDO - Le variabili di tipo Double (con virgola mobile a precisione doppia)sono memorizzate come numeri IEEE a 64 bit (8 byte) compresi nell'intervallo fra -1.79769313486231E308 e -4,94065645841247E-324 per i valori negativi, e fra 4,94065645841247E-324 e 1,79769313486232E308 per quelli positivi

 

·          NI - Le variabili di tipo Integer sono memorizzate come numeri a 16 bit (2 byte) compresi nell'intervallo fra -32.768 e 32.767

 

·          NL - Le variabili di tipo Long (a intero lungo) sono memorizzate come numeri con segno a 32 bit (4 byte) compresi nell'intervallo fra -2.147.483.648 e 2.147.483.647.

 

 

·          NSI - Le variabili di tipo Single (con virgola mobile a precisione singola) sono memorizzate come numeri IEEE di 32 bit (4 byte) compresi nell'intervallo fra -3,402823E38 e -1,401298E-45 per i valori negativi e fra 1,401298E-45 e 3,402823E38 per quelli positivi.

 

·          OB - Le variabili di tipo Object sono memorizzate come indirizzi di 32 bit (4 byte) riferiti a oggetti. A una variabile dichiarata come Object è possibile assegnare qualsiasi riferimento a un oggetto mediante l'istruzione Set.

 

 

·          DA - Le variabili di tipo Date sono memorizzate come numeri IEEE di 64 bit (8 byte) che rappresentano date comprese nell'intervallo fra l'1 gennaio 100 e il 31 dicembre 9999 e orari compresi fra le 0.00.00 e le 23.59.59.

 

·          ST - Le variabili di tipo String possono essere:

              Stringhe di lunghezza variabile, che possono contenere fino a circa 2 miliardi (2^31) di caratteri.

              Stringhe di lunghezza fissa, che possono contenere da 1 a circa 64 KB (2^16) di caratteri.

Nota   Una stringa di lunghezza fissa di tipo Public non può essere utilizzata in un modulo di classe.

I codici per i caratteri String sono compresi fra 0 e 255. I primi 128 caratteri (0-127) del set di caratteri corrispondono alle lettere e ai simboli di una tastiera standard americana. Questi primi 128 caratteri sono gli stessi definiti dal set di caratteri ASCII.

 

·          VA - Il tipo di dati Variant è il tipo di dati in cui vengono trasformate tutte le variabili se non sono dichiarate esplicitamente.

 

·          DF -Tipi di dati definiti dall'utente, qualsiasi tipo di dati definito utilizzando l'istruzione Type. I tipi di dati definiti dall'utente possono contenere uno o più elementi di qualsiasi tipo di dati, tipo di matrice o di un tipo di dati precedentemente definito dall'utente.

 

?>

posted on sabato 29 ottobre 2005 19.24