Leggere il contenuto di un file txt con vb net 2010

martedì 02 agosto 2011 - 11.07

trinity Profilo | Guru

Ragazzi utilizzo vb net 2010 e devo leggere il contenuto di un file ascii...Prima di tutto vi chiedo se il codice che ho utilizzato è obsoleto oppure e l'ultimo che vb 2010 utilizza o c'è un codice migliore?

Dim openFileDialog1 As New OpenFileDialog()
openFileDialog1.InitialDirectory = "c:\"
openFileDialog1.Filter = "txt files (*.txt)|*.txt"
openFileDialog1.FilterIndex = 2
openFileDialog1.RestoreDirectory = True

If openFileDialog1.ShowDialog() = DialogResult.OK Then
Me.Label2.Text = openFileDialog1.FileName
Dim riga As String = Nothing
Dim fileReader As System.IO.StreamReader
fileReader = New StreamReader(openFileDialog1.FileName)
If Not (fileReader Is Nothing) Then
riga = fileReader.ReadLine
While Not riga Is Nothing
riga = fileReader.ReadLine()
Me.ListView1.Items.Add(riga)
End While
End If
End If

Il mio problema è che salta la lettura della prima riga parte direttamente dalla seconda...come mai? dove sbaglio?

Ciao e grazie
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

MarKonE Profilo | Guru

>Il mio problema è che salta la lettura della prima riga parte
>direttamente dalla seconda...come mai? dove sbaglio?

Ciao, non è che salta una riga... ma semplicemente che la prima aggiunta avviene dopo *2* cicli di lettura:

If Not (fileReader Is Nothing) Then
riga = fileReader.ReadLine <<---- qui legge la prima
While Not riga Is Nothing
riga = fileReader.ReadLine() <<--- qui legge la seconda
Me.ListView1.Items.Add(riga) <<--- qui aggiunge la prima riga (cioè la seconda del file) al list view
End While
End If
End If

Ciao !

My Blog... http://blogs.dotnethell.it/Mark/

nico839 Profilo | Senior Member

>Ragazzi utilizzo vb net 2010 e devo leggere il contenuto di un
>file ascii...Prima di tutto vi chiedo se il codice che ho utilizzato
>è obsoleto oppure e l'ultimo che vb 2010 utilizza o c'è un codice
>migliore?

non so se sia meno obsoleto e più performante o che altro, ma esiste anche il metodo:

My.Computer.FileSystem.ReadAllText("nomefile")

che restituisce tutto un file di testo in una stringa. Ma ripeto, non so se sia migliore o peggiore, poi naturalmente dipende che devi fare....
Ciao.
Nicolas

http://perledinico.blogspot.com

MarKonE Profilo | Guru

Esatto,

esiste anche ReadAllLines, che popola un array di stringhe con una riga ciascuna.

Cosa devi ottenere di preciso ? Magari sarà più facile capire la strada migliore.

CIAOOO
My Blog... http://blogs.dotnethell.it/Mark/

trinity Profilo | Guru

guarda ho riscritto la seconda parte del codice:

Dim riga As String = Nothing
Using fileReader As New StreamReader(Me.Label2.Text)
If Not (fileReader Is Nothing) Then
riga = fileReader.ReadLine
While Not riga Is Nothing
riga = fileReader.ReadLine()
End While
End If
End Using

il codice ora funziona...

Cosa devo fare in pratica ho un file ascii con una serie di record all'interno che devo leggere e poi successivamente questi dati li devo salvare in un db, quest'ultima fase no problem...
Ecco io vorrei ora applicare una progressbar che faccia vedere il numero di record che legge...ora per utilizzarla dovrei sapere già il totale delle righe all'interno del file perchè devo applicarlo alla proprietà maximum della progressbar

ovviamente la using chiude lo stream oppure devo fare cmq la close?

Ciao e grazie


Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

nico839 Profilo | Senior Member

come suggerito da MarKonE potresti usare

Dim readText() As String = File.ReadAllLines(path) Dim s As String For Each s In readText quello che ci devi fare con ogni riga Next

così dal count di readText avresti il Maximum della progress bar
Ciao.
Nicolas

http://perledinico.blogspot.com

MarKonE Profilo | Guru

>Cosa devo fare in pratica ho un file ascii con una serie di record
>all'interno che devo leggere e poi successivamente questi dati
>li devo salvare in un db, quest'ultima fase no problem...

Io utilizzerei il metodo sopra indicato, ReadAllLines : http://msdn.microsoft.com/en-us/library/s2tte0y1.aspx


>Ecco io vorrei ora applicare una progressbar che faccia vedere
>il numero di record che legge...ora per utilizzarla dovrei sapere
>già il totale delle righe all'interno del file perchè devo applicarlo
>alla proprietà maximum della progressbar

Dopo aver popolato l'array ti basterà assegnare alla progressbar il numero dei valori ottenuti : http://msdn.microsoft.com/it-it/library/system.array.length.aspx
>
Ciao !
My Blog... http://blogs.dotnethell.it/Mark/

trinity Profilo | Guru

ok e si potrebbe applicare il metodo using..end using in questo codice?
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

MarKonE Profilo | Guru

Direi di si !

Ciaooo
My Blog... http://blogs.dotnethell.it/Mark/

trinity Profilo | Guru

e scusa e dove si applica perchè su questa riga di codice:

Dim readText() As String = File.ReadAllLines(path)

non funziona da errore

io invece lo inserivo su

Using fileReader As New StreamReader(path)
....
End Using
Cirillo Fabio
www.wondernet.biz
fabio@wondernet.biz
http://blogs.dotnethell.it/fabiocirillo/
http://wnetsoftware.blogspot.com

nico839 Profilo | Senior Member

da errore perchè "Matrice a 1 dimensione di string" non ha il metodo "Dispose".
invece dell' "using ... end using" perchè non usi il "try/finally"?

http://www.codeproject.com/Articles/117478/Using-Statement-and-Dispose-Method-in-C-and-VB-NET?msg=3659676
Ciao.
Nicolas

http://perledinico.blogspot.com
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2017
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5