LEGGERE UN FILE DI TESTO

Come tutti i linguaggi di programmazione, anche C# e VB.NET permettono di leggere file di testo, come ad esempio file .csv. La caratteristica di questi linguaggi è che mettono a disposizione più metodi per la lettura di un file, in questo articolo ne esaminiamo 3:

Hardcode: Questo metodo, seppure il più semplice, risulta essero poco elastico e maneggevole; per questo motivo non viene utilizzato molto spesso. Questo metodo prevede la creazione di una variabile di tipo stringa. La stringa inizializzata in questa variabile sarà proprio il path o percorso del file che ci interessa importare. Come abbiamo detto, questo metodo è molto semplice ma poco “redditizio”.

// metodo hardcode

Dim NomeFile As String = "C://Statistica_Applicata/Automobili.csv"

StreamerReader: Questo strumento, messo a disposizione di Microsoft, è molto potente e flessibile. Per utilizzarlo non è richiesta l’aggiunta fai una referenza poiché i comandi sono già resi disponibile dall’azienda americana per entrambi i linguaggi. La peculiarità di questo oggetto è che ha a disposizione una moltitudine di metodi assai utili. Per ottenere il path del file utilizziamo una “Open File Dialog”. Al passo successivo, che possiamo chiamare passo 2, dobbiamo installare un’oggetto in grado di leggere il path. Dopodiché dovremo poter leggere le righe di testo del file, facendo attenzione alla prima riga, che potrebbe contenere il nome delle variabili (header), e poi estrarre i dati. Questi dati dovranno poi essere memorizzati in appositi oggetti come una lista attraverso l’uso di una classe.

// ottenimento del path con una Open File Dialog

Dim ofd As New OpenFileDialog
ofd.ShowDialog()

//istanziamento del path in un oggetto

Dim sr As New System.IO.StreamReader(ofd.FileName)

//lettura delle righe del file e estrazione dei dati

Dim sr As New StreamReader(ofd.FileName)
Dim RigaH As String = sr.ReadLine()   'in questo modo leggo l'header
While Not sr.EndOfStream
 Dim RigaDati As String = sr.ReadLine()
 Dim Dati() As String = RigaDati.Split(",".ToCharArray,StringSplitOptions.RemoveEmptyEntries)
End While

//all'interno del ciclo inserirò anche una variabile con tipo la classe creata per inserire i dati.

TextFieldParse: oggetto meno potente del precedente, ma specializzato nella lettura dei file .csv. Se si utilizza il linguaggio Vb.Net non è richiesta l’aggiunta di una referenza, mentre se si usa il linguaggio C# si. La sintassi e i metodi utilizzati non differiscono molto dallo StreamReader; i due differiscono solo dall’inizializzazione del path, per la sostituzione del comando di split presente nel ciclo appena visto e per la specificazione dei delimitatori. Per questo motivo vediamo la codifica solo di queste differenze.

//inizializzazione del path

Dim tap As New Microsoft.VisualBasic.FileIO.TextFieldParse(FileName)

// comando sostitutivo dello split nel ciclo

tfp.ReadFilds()

//inizializzazione proprietà delimitatori

tfp.SetDelimiters(New String() {","})
tfp.CommentTokens = New String() {"#"}
tfp.HasFieldsEnclodesInQuotes = True

Una menzione speciale va fatta ai alle azione DragDrop e DragEnter. Esse permettono la lettura di un file attraverso il trascinamento della richTextBox, dopo aver abilitato questa possibilità dalle proprietà dello strumento. Vediamo ora la sintassi di questi due gestori

//nel gestore di DragEnter
If e.Data.GetDataPresent(DataFormats.FileDrop) Then e.Effect = DragDropEffects.Copy

//nel gestore DragDrop
e.Effect = DragDropEffects.None
Dim Files() As String = CTyper(e.Data.GetData(DataFormats.FileDrop), String())
For Each path In Files
 Me.RichTextBox1.AppendText(vbCrLf & path)
Next

//per richiamare il file
NomeFile = RichTextBox1.Text

E’ utile anche menzionare il metodo “Dispose()”disponibile sia per StreamReader che per TextFieldParse. Esso permette di rilasciare il file dopo le modifiche, poiché se il file viene danneggiato, altri programmi potrebbero non riuscire ad aprirlo correttamente. Per questo motivo tutte le istruzione dovrebbero andare in un TRY-CATH e il metodo Dispose() nel Finally. Questo metodo di procedere però è molto scomodo, per questo motivo è stata creata la struttura Using, che richiede che l’oggetto abbia un metodo Dispose. La presenza di questa struttura rende superfluo l’utilizzo del TRY-CATCH.

// all'inizio del codice inserisco
Using top As New Microsoft.VisualBasic.FileIO.TestFieldParse(Me.NomeFile)

//alla fine del codice
End Using

Lascia un commento

Progetta un sito come questo con WordPress.com
Comincia ora