2011-09-02 83 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選項,所以使用現有系統甚至比花時間寫更差的系統更便宜。

這就是說,如果這只是一個學術練習,就去做吧。但是,我不會爲真實世界的系統做到這一點。

相關問題