开发者

How To Read From Text File & Store Data So To Modify At A Later Time

What I am trying to do may be better for use with SQL Server but I have seen many applications in the past that simply work on text files and I am wanting to try to imitate the same behaviour that those applications follow.

I have a list of URL's in a text file. This is simple enough to open and read line by line, but how can I store additional data from the file and query the data?

E.g. Text File:

http://link1.com/ - 0
http://link2.com/ - 0
http://link3.com/ - 1
http://link4.com/ - 0
http://link5.com/ - 1

Then I will read the data with:

Private Sub ButtonX2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ButtonX2.Click
        OpenFileDialog1.Filter = "*txt Text Files|*.txt"
        If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
            Dim AllText As String = My.Computer.FileSystem.ReadAllText(OpenFileDialog1.FileName)
            Dim Lines() = Split(AllText, vbCrLf)
            Dim list = New List(Of Test)
            Dim URLsLoaded As Integer = 0
            For i = 0 To UBound(Lines)
                If Lines(i) = "" Then Continue For
                Dim URLInfo As String() = Split(Lines(i), " - ")
                If URLInfo.Count < 6 Then Continue For
                list.Add(New Test(URLInfo(0), URLInfo(1)))
                URLsLoaded += 1
            Next
            DataGridViewX1.DataSource = list
            LabelX5.Text = URLsLoaded.ToString()
        End If
    End Sub

So as you can see, above I am prompting the user to open a text file, afterwards it is displayed back to the user in a datagridview.

Now here is my issue, I want to be able to query the data, E.g. Select * From URLs WHERE active='1' (Too used to PHP + MySQL!)

Where the 1 is the corresponding 1 or 0 after the URL in the text file.

In the above example the data is being stor开发者_JS百科ed in a simple class as per below:

Public Class Test
    Public Sub New(ByVal URL As String, ByVal Active As Integer)
        _URL = URL
        _Active = Active
    End Sub

    Private _URL As String
    Public Property URL() As String
        Get
            Return _URL
        End Get
        Set(ByVal value As String)
            _URL = value
        End Set
    End Property

    Private _Active As String
    Public Property Active As String
        Get
            Return _Active
        End Get
        Set(ByVal value As String)
            _Active = value
        End Set
    End Property

End Class

Am I going completely the wrong way about storing the data after importing from a text file?

I am new to VB.NET and still learning the basics but I find it much easier to learn by playing around before hitting the massive books!


Working example:

Dim myurls As New List(Of Test)
myurls.Add(New Test("http://link1.com/", 1))
myurls.Add(New Test("http://link2.com/", 0))
myurls.Add(New Test("http://link3.com/", 0))

Dim result = From t In myurls Where t.Active = 1

For Each testitem As Test In result
    MsgBox(testitem.URL)
Next

By the way, LINQ is magic. You can shorten your loading/parse code to 3 rows of code:

Dim Lines() = IO.File.ReadAllLines("myfile.txt")
Dim myurls As List(Of Test) = (From t In lines Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
DataGridViewX1.DataSource = myurls

The first line reads all lines in the file to an array of strings. The second line splits each line in the array, and creates a test-item and then converts all those result items to an list ( of Test).

Of course this could be misused to sillyness by making it to a one-row:er:

DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList

Wich would render your load function to contain only following 4 rows:

If OpenFileDialog1.ShowDialog() = DialogResult.OK Then
        DataGridViewX1.DataSource = (From t In IO.File.ReadAllLines("myfile.txt") Select New Test(Split(t, " - ")(0), Split(t, " - ")(1))).ToList
        LabelX5.Text = ctype(datagridviewx1.datasource,List(Of Test)).Count
End If


You can query your class using LINQ, as long as it is in an appropriate collection type, like List(of Test) . I am not familiar completely with the VB syntax for LINQ but it would be something like below.

list.Where(Function(x) x.Active == "1").Select(Function(x) x.Url)

However, this isnt actually storing anything into a database, which i think your question might be asking?


I think you are reinventing the wheel, which is not generally a good thing. If you want SQL like functionality just store the data in a SQL DB and query it.

There are a lot of reasons you should just use an existing DB:

  • Your code will be less tested and thus more likely to have bugs.
  • Your code will be less optimized and probably perform worse. (You were planning on implementing a query optimizer and indexing engine for performance, right?)
  • Your code won't have as many features (locking, constraints, triggers, backup/recovery, a query language, etc.)
  • There are lots of free RDBMS options out there so it might even be cheaper to use an existing system than spending your time writing an inferior one.

That said, if this is just an academic exercise, go for it. However, I wouldn't do this for a real-world system.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜