如何阅读文本文件&存储数据以便以后修改

时间:2011-09-02 00:09:22

标签: vb.net visual-studio visual-studio-2010 oop

我尝试做的事情可能更适合与SQL Server一起使用,但我在过去看到过很多应用程序只处理文本文件,我想尝试模仿这些应用程序遵循的相同行为。

我在文本文件中有一个URL列表。这很简单,可以逐行打开和读取,但如何从文件中存储其他数据并查询数据呢?

E.g。 文本文件:

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

然后我会用以下内容阅读数据:

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

正如您所看到的,上面我提示用户打开一个文本文件,之后它会在datagridview中显示回用户。

现在这是我的问题,我希望能够查询数据,例如。选择*来自URL WHERE active ='1'(过去常用于PHP + MySQL!)

其中1是文本文件中URL后面的对应1或0。

在上面的示例中,数据存储在一个简单的类中,如下所示:

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

从文本文件导入后,我是否完全错误地存储数据?

我是VB.NET的新手,并且仍在学习基础知识,但我发现在阅读大量书籍之前,通过玩游戏更容易学习!

3 个答案:

答案 0 :(得分:1)

您可以使用LINQ查询您的类,只要它在适当的集合类型中,例如List(of Test)。我不完全熟悉LINQ的VB语法,但它将类似于下面的内容。

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

但是,这实际上并没有将任何东西存储到数据库中,我认为你的问题可能会问?

答案 1 :(得分:1)

工作示例:

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

顺便说一下,LINQ很神奇。您可以将加载/解析代码缩短为3行代码:

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

第一行将文件中的所有行读取为字符串数组。 第二行拆分数组中的每一行,并创建一个测试项,然后将所有这些结果项转换为一个列表(Test)。

当然,这可能会被误用于愚蠢行为:呃:

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

将使您的加载函数仅包含以下4行:

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

答案 2 :(得分:0)

我认为你正在重新发明轮子,这通常不是一件好事。如果您希望SQL功能只是将数据存储在SQL DB中并进行查询。

您应该使用现有数据库的原因有很多:

  • 您的代码测试较少,因此更容易出错。
  • 您的代码将不太优化,可能会更糟糕。 (您计划实现查询优化器和索引引擎以获得性能,对吗?)
  • 您的代码将没有尽可能多的功能(锁定,约束,触发器,备份/恢复,查询语言等)。
  • 有很多免费的RDBMS选项,所以使用现有系统甚至比花时间写一个劣质系统更便宜。

那就是说,如果这只是一次学术活动,那就去吧。但是,对于现实世界的系统,我不会这样做。