Γράψιμο και Διάβασμα σε Text files (StreamWriter και StreamReader)

Το παρακάτω παράδειγμα γράφει και διαβάζει πληροφορίες σε/από απλά αρχεία κειμένου (text files). Κάθε γραμμή του αρχείου αφορά μία εγγραφή δεδομένων (π.χ. πελάτη) και τα πεδία διαχωρίζονται με κάποιο σύμβολο (πχ. το ελληνικό ερωτηματικό). Το απλοϊκό παράδειγμά μας αφορά ένα ταξιδιωτικό γραφείο που κρατά, για κάθε πελάτη, τις πληροφορίες (πεδία) : Ονοματεπώνυμο, προορισμοί, χώρες και κόστος εκδρομής.

Η εγγραφή στο text αρχείο θα γίνει με ένα αντικείμενο StreamWriter και η ανάγνωση με ένα αντικείμενο StreamReader που παρέχει η VB. Για την εμφάνιση και διαχείριση των δεδομένων επί της οθόνης θα χρησιμοποιήσουμε ένα DataGridView control που θα έχει ως πηγή ένα DataTable. Μέσω του StreamReader αντικειμένου θα διαβάζουμε τα δεδομένα του text αρχείου και θα τα βάζουμε στο DataTable οπότε αυτόματα θα εμφανίζονται στο DataGridView. Αντίστροφα, θα βάζουμε τα δεδομένα του DataTable στο StreamWriter αντικείμενο για να γραφτούν στο text αρχείο.

TextReadWrite-2.jpg

Τα δεδομένα στο Grid είναι ταξινομημένα κατά Ονοματεπώνυμο αλλά η πραγματική σειρά καταχώρησής τους φαίνεται στο text αρχείο..

Imports System.IO

Public Class Form1

Dim pathFile$ = Application.ExecutablePath & "\..\"
Dim FileName$ = "
ΕΚΔΡΟΜΕΣ.txt"
Dim Delim$ = ";" '
Ο διαχωριστής των πεδίων κάθε γραμμής στο text File.

'H λίστα των πελατών. Θα χρησιμεύσει ως πηγή δεδομένων του DataGridView.
Dim TablePelates As New DataTable


'------------------------------------------------


Private Sub Form1_Load(ByVal sender As System.Object, _

                       ByVal e As System.EventArgs) _

Handles MyBase.Load

 

'Δημιούργησε τα πεδία πληροφοριών του DataTable.
Dim c As New DataColumn
c.ColumnName = "
Ονοματεπώνυμο"
c.DataType = GetType(System.String)
TablePelates.Columns.Add(c)
c = Nothing

 

c = New DataColumn
c.ColumnName = "
Προορισμοί"
c.DataType = GetType(System.String)
TablePelates.Columns.Add(c)
c = Nothing

 

c = New DataColumn
c.ColumnName = "
Χώρες"
c.DataType = GetType(System.String)
TablePelates.Columns.Add(c)
c = Nothing

 

c = New DataColumn
c.ColumnName = "
Κόστος"
c.DataType = GetType(System.Single)
TablePelates.Columns.Add(c)
c = Nothing

 

'Ορισέ το ως πηγή για το DataGridView και κάνε κάποιες μορφοποιήσεις.
With grdData

.DataSource = TablePelates
.ColumnHeadersDefaultCellStyle.Font = New Font(.Font.FontFamily, _
                                        .Font.Size, FontStyle.Bold)
.Columns(0).Width = 180
.Columns(1).Width = 180
.Columns(2).Width = 180
.Columns(3).Width = 80
.Columns(3).DefaultCellStyle.Alignment = _
                            DataGridViewContentAlignment.TopRight
.Columns(3).DefaultCellStyle.Format = "c" 'Currency formatted value.

End With

End Sub


'------------------------------------------------


'Γράψιμο των δεδομένων του Grid στο text file.
Private Sub btnWriteToFile_Click(ByVal sender As System.Object, _

   ByVal e As System.EventArgs) _

 Handles btnWriteToFile.Click

 

'Για την εγγραφή θα δημιουργήσουμε ένα αντικείμενο StreamWriter.
Using TextWriter As New StreamWriter(pathFile & FileName)

Dim cnt% = TablePelates.Rows.Count, i%
Dim r As DataRow


'Διάβασε μία-μία εγγραφή του DataTable
‘και γράψε μία γραμμή στο
text file.
For i = 0 To cnt - 1

r = TablePelates.Rows(i)
With r

TextWriter.WriteLine(.Item("Ονοματεπώνυμο") & Delim & _
                     .Item("
Προορισμοί") & Delim & _
                     .Item("
Χώρες") & Delim & _
                     .Item("
Κόστος"))

End With

Next

TextWriter.Close()

End Using

End Sub


'------------------------------------------------


'Διάβασμα των δεδομένων του
text file στο Grid .
Private Sub btnReadFromFile_Click(ByVal sender As System.Object, _

                                  ByVal e As System.EventArgs) _

 Handles btnReadFromFile.Click

 

'Για την ανάγνωση θα δημιουργήσουμε ένα αντικείμενο StreamReader.
Using TextReader As New StreamReader(pathFile & FileName)

Dim Line$ = ""
Dim RecArrayLine$()
Dim r As DataRow

'Καθάρισε τiς γραμμές του DataTable.
TablePelates.Rows.Clear()

Do

'Διάβασε τη γραμμή.
Line = TextReader.ReadLine
If Line Is Nothing Then Exit Do

'Η μέθοδος Split θα μας δώσει τις πληροφορίες
‘των πεδίων της γραμμής σε έναν
Array.
RecArrayLine = Line.Split(Delim)

'Τοποθέτησέ τες σε ένα DataRow
r = TablePelates.NewRow
With r

.Item("Ονοματεπώνυμο") = RecArrayLine(0)
.Item("
Προορισμοί") = RecArrayLine(1)
.Item("
Χώρες") = RecArrayLine(2)
.Item("
Κόστος") =  _
   IIf(RecArrayLine(3).ToString = "", 0, RecArrayLine(3))

End With

'Πρόσθεσε τη γραμμή στο DataTable.
TablePelates.Rows.Add(r)

Loop Until Line Is Nothing

TextReader.Close()

End Using

End Sub


'------------------------------------------------


'Καθαρισμός του Grid.
Private Sub bntResetGrid_Click(ByVal sender As System.Object, _

 ByVal e As System.EventArgs) _

 Handles bntResetGrid.Click

 

'Διέγραψε τις γραμμές από το DataTable.
TablePelates.Rows.Clear()

End Sub


'------------------------------------------------


'Έλεγχος εγκυρότητας του κόστους. Πρέπει να είναι Single type.
Private Sub grdData_CellValidating(ByVal sender As Object,_

 ByVal e As System.Windows.Forms.DataGridViewCellValidatingEventArgs) _

Handles grdData.CellValidating

If e.FormattedValue.ToString = "" Then Exit Sub

If e.ColumnIndex = 3 Then 'Κόστος

Try

Dim _cost! = CSng(e.FormattedValue)

Catch

MsgBox("Δεν δώσατε έγκυρη τιμή κόστους", _
                    MsgBoxStyle.Information, "
Κόστος")
e.Cancel = True

End Try

End If

End Sub

'------------------------------------------------


End Class

 

·         Χρήστος Μουρατίδης