Go Premium for a chance to win a PS4. Enter to Win

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 314
  • Last Modified:

What is the reverse to this code? - Reading and writing between Text file and DataView/DataSet

The following code sucessfully creates and writes the contents of a DataView (each value seperated by '#') to a Text file. Please can someone give me the code that will correctly read it back?

    Private Sub SaveDBToFile()
          Dim path As String = "C:\Temp\MyFile.txt"

        'Create the file.
        Dim fs As FileStream = File.Create(path)

        Dim myDRV As DataRowView
        For Each myDRV In MyDataView
            For i As Integer = 0 To MyDataView.Table.Columns.Count - 1
                If (Not (myDRV(i) Is DBNull.Value)) Then
                    AddText(fs, CType(myDRV(i), String) + "#")  
                Else
                    AddText(fs, " #")
                End If
            Next
            AddText(fs, Environment.NewLine)
        Next
        fs.Close()
    End Sub

    Private Shared Sub AddText(ByVal fs As FileStream, ByVal value As String)
        Dim info As Byte() = New UTF8Encoding(True).GetBytes(value)
        fs.Write(info, 0, info.Length)
    End Sub
0
IvanHowarth
Asked:
IvanHowarth
  • 3
1 Solution
 
RamuncikasCommented:
       'open file
        Dim fs As New FileStream("C:\Temp\MyFile.txt", FileMode.Open)

        'read file to bytes() array
        Dim bytes() As Byte
        fs.Read(bytes, 0, fs.Length - 1)

        'convert bytes to string
        Dim str As String
        Dim enc As New System.Text.UTF8Encoding(True)
        str = enc.GetString(bytes, 0, bytes.GetUpperBound(0))
        fs.Close()

        'split string into lines
        Dim sLines() As String
        sLines = str.Split(Environment.NewLine)

        'create table
        Dim table As New DataTable
        '*********************
        'add table columns here
        '*********************
        Dim counter As Int32
        Dim row As DataRow

        'itearte through lines
        For Each Line As String In sLines
            row = table.NewRow
            counter = 0

            'split line into columns
            Dim sCols() As String
            sCols = Line.Split("#")

            'iterate through columns
            For Each Col As String In sCols
                If Col = String.Empty Then
                    row(counter) = Convert.DBNull
                Else
                    row(counter) = Col
                End If
                counter += 1
            Next
            table.Rows.Add(row)
        Next

HTH
Ramuncikas
0
 
IvanHowarthAuthor Commented:
The first half of your code throws a complete wobbly :(

The following error message keeps recurring (regardless if it's in a try-catch statement) and can only be stopped by killing the process via task manager:

System.IO.IOException: The process cannot access the file "C:\Temp\MyTest.txt" because it is being used by another process.
  at System.IO._Error.WinIOError(Int32 errorCode, String str)
  at System.IO.FileStream..ctor(String path, FileMode mode, FileAccess access, FileShare share, Int32 bufferSize,
Boolean useAsync, String msgPath, Boolean bFormProxy)
  at System.IO.Stream..ctor(String path, FileMode mode)
  at [MyApp]

(path is a variable containing the path of the file)

Any ideas?
0
 
IvanHowarthAuthor Commented:
Disregard the above error message, I have now moved the method call as the first line to avoid any conflict.
Nevertheless, I do get the following problem:

System.ArgumentNullException: Buffer cannot be null.
Parameter name: array
  at System.IO.FileStream.Read(Byte[]array,Int32 offset, Int32 count)
  ...

Re wrote your array declaration to:

Dim bytes(CInt(fs.Length - 1)) As Byte

and then you get:

System.IndexOutOfRangeException: Cannot find column 34.
  at System.DataColumnCollection.get_Item(Int32 index)
  at System.Data.DataRow.set_Item(Int32 columnIndex, Object value)
  ...

34 columns was written to file. fs.Length gives a value of 304229
0
 
IvanHowarthAuthor Commented:
Problem found....

In my original code [AddText(fs, CType(myDRV(i), String) + "#") ] appended the # to the last column. Your code then looked for another column after this that didn't exist. I slightly modified your code so it didn't read that far:

                sCols = Line1.Split(CChar("#"))
                For y As Integer = 0 To sCols.Length - 2
                    ...
                Next
0

Featured Post

Free Tool: SSL Checker

Scans your site and returns information about your SSL implementation and certificate. Helpful for debugging and validating your SSL configuration.

One of a set of tools we are providing to everyone as a way of saying thank you for being a part of the community.

  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now