【问题标题】:How To Read From Text File & Store Data So To Modify At A Later Time如何从文本文件中读取并存储数据以便以后修改
【发布时间】:2012-02-13 11:02:13
【问题描述】:

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

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

例如 文本文件:

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 中显示给用户。

现在这是我的问题,我希望能够查询数据,例如Select * From URLs 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 的新手,仍在学习基础知识,但我发现在阅读大量书籍之前通过玩玩学习更容易!

【问题讨论】:

  • “在从测试文件导入数据后存储数据”是指如何在 proram 运行时将其存储在内存中并且还具有类似 db-engine 的查询功能?

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


【解决方案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

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

当然,这可能会被误用为单排:er:

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

Wich 将使您的加载函数仅包含以下 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

【讨论】:

  • 感谢您的帮助,我想我会继续从这本书中学习,我在直接开始之前已经开始了更多。我发现 PHP/MySQL 比 VB.NET 更容易学习,并希望我以前对其他编程语言的了解会有所帮助,但这种语言似乎要复杂得多!
【解决方案2】:

您可以使用 LINQ 查询您的类,只要它位于适当的集合类型中,例如 List(of Test) 。我对 LINQ 的 VB 语法并不完全熟悉,但它会像下面这样。

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

但是,这实际上并没有将任何内容存储到数据库中,我认为您的问题可能会问到这一点?

【讨论】:

  • 他似乎想在不使用数据库引擎的情况下使用类似查询功能的数据库。所以我认为你的答案是正确的。 LINQ 可用于对象、类、结构列表等。
【解决方案3】:

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

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

  • 您的代码测试较少,因此更有可能出现错误。
  • 您的代码优化程度较低,并且性能可能更差。 (您正计划实施查询优化器和索引引擎以提高性能,对吗?)
  • 您的代码将没有那么多功能(锁定、约束、触发器、备份/恢复、查询语言等)
  • 市面上有很多免费的 RDBMS 选项,因此使用现有系统甚至可能比花时间编写劣质系统更便宜。

也就是说,如果这只是一个学术练习,那就去做吧。但是,我不会为现实世界的系统这样做。

【讨论】:

    猜你喜欢
    • 2015-10-07
    • 2020-10-18
    • 1970-01-01
    • 2011-01-10
    • 2014-06-20
    • 1970-01-01
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多