Solved

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

Posted on 2006-07-15
4
311 Views
Last Modified: 2012-05-05
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
Comment
Question by:IvanHowarth
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 3
4 Comments
 
LVL 14

Accepted Solution

by:
Ramuncikas earned 500 total points
ID: 17115525
       '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
 

Author Comment

by:IvanHowarth
ID: 17116538
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
 

Author Comment

by:IvanHowarth
ID: 17116694
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
 

Author Comment

by:IvanHowarth
ID: 17116790
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

Instantly Create Instructional Tutorials

Contextual Guidance at the moment of need helps your employees adopt to new software or processes instantly. Boost knowledge retention and employee engagement step-by-step with one easy solution.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
If you need to start windows update installation remotely or as a scheduled task you will find this very helpful.
In this video, viewers will be given step by step instructions on adjusting mouse, pointer and cursor visibility in Microsoft Windows 10. The video seeks to educate those who are struggling with the new Windows 10 Graphical User Interface. Change Cu…
Do you want to know how to make a graph with Microsoft Access? First, create a query with the data for the chart. Then make a blank form and add a chart control. This video also shows how to change what data is displayed on the graph as well as form…

636 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question