2011-09-02 80 views
0

我想要做的可能会更好用于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中的用户。

现在,这是我的问题,我希望能够查询数据,例如。选择*从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的新手,仍然在学习基础知识,但是我发现通过在打大量书籍前玩耍学习更容易!

+0

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

回答

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(Test)列表。ER:

当然,这可以通过它进行到一排被滥用,sillyness

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 
+0

感谢您的帮助,我想我会继续从我开始学习之前继续学习一些知识。我发现PHP/MySQL比VB.NET更容易学习,希望我以前的其他编程知识语言会帮助很多,但这种语言似乎更复杂! – Chris

1

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

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

然而,这个心不是实际存储任何东西到数据库中,我认为你的问题可能会问?

+0

似乎他想要使用数据库而不需要使用数据库引擎而不需要查询功能。所以我认为你的回答是正确的。 LINQ与对象,类,结构列表等一起工作。 – Stefan

0

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

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

  • 你的代码将被测试较少,因而更容易出现错误。
  • 您的代码将不太优化,并可能表现更差。 (您正在计划实现查询优化器和索引引擎以提高性能,对吗?)
  • 您的代码将不具有尽可能多的功能(锁定,约束,触发器,备份/恢复,查询语言等)
  • 这里有很多免费的RDBMS选项,所以使用现有系统甚至比花时间写更差的系统更便宜。

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

相关问题