2013-06-29 99 views
0

我犯了一個程序,它從IMDB API的發佈日期和標題和.txt文件保存他們他們...我可以按日期莫名其妙順序按日期txt文件用vb.net

enter image description here責令其

Imports System.IO 
Imports System.Xml.Linq 
Imports System.Text.RegularExpressions 

Public Class Form1 

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click 

     Dim _reg As Regex = New Regex("http://www.imdb.com/title/([A-Za-z0-9\-]+)/*?", _ 
       RegexOptions.IgnoreCase) 

     Dim value As String = TextBox1.Text 

     Dim m As Match = _reg.Match(value) 

     If (m.Success) Then 
      Dim key As String = m.Groups(1).Value 
      Dim url As String = "http://mymovieapi.com/?id=" + key + "&type=xml&plot=none&episode=0&lang=en-US&aka=simple&release=simple&business=0&tech=0" 
      Dim Document As XDocument = XDocument.Load(url) 
      Dim title = Document.Root.Element("title").Value() 
      Dim releaseDate = Date.ParseExact(Document.Root.Element("release_date").Value, 
        "yyyyMMdd", System.Globalization.CultureInfo.InstalledUICulture) 
      TextBox2.Text = "Release Date: " & releaseDate & "/ Title: " & title 
     Else : TextBox2.Text = "Please use IMDB links" 
     End If 
     Button2.Enabled = True 
    End Sub 


    Private Sub Button2_Click_1(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
     Dim Writer As System.IO.StreamWriter 
     Writer = New System.IO.StreamWriter("C:\Users\Azer\Documents\Movies.txt", True) 
     Writer.Write(TextBox2.Text & vbCrLf) 
     Writer.Close() 
     Button2.Enabled = False 
    End Sub 

    Private Sub Button4_Click(sender As System.Object, e As System.EventArgs) Handles Button4.Click 
     Dim Reader As System.IO.StreamReader 
     Reader = New System.IO.StreamReader("C:\Users\Azer\Documents\Movies.txt") 
     Dim tempstring As String 
     Do 
      tempstring = Reader.ReadLine() 
      TextBox3.Text = TextBox3.Text + tempstring + vbCrLf 
     Loop Until tempstring = "" 
     Reader.Close() 
    End Sub 

    Private Sub Button3_Click(sender As System.Object, e As System.EventArgs) Handles Button3.Click 
     Me.Close() 
    End Sub 

    Private Sub Button5_Click(sender As System.Object, e As System.EventArgs) Handles Button5.Click 
     TextBox3.Clear() 
    End Sub 
End Class 
+1

你只需要對它們進行一次排序?或者文本文件會隨着時間的推移而增長,並且每次修改時都需要對它進行排序?或者,您只需在從文本文件中讀回時進行排序?請詳細說明。另外,請顯示您用來做這些事情的代碼。到目前爲止,你真正要問的是,如果可以按日期排序,並且答案是肯定的。但是,如果沒有任何實際的代碼,我們不可能更具體。 – David

+0

文本文件將隨着時間的推移而增長,並且需要每次都對其進行排序,代碼處於pastebin鏈接,因爲它太大而無法在此整體發佈 – gazerable

+0

如果您需要重新排序整個文件(以便將其存儲在排序狀態),每次你需要讀取整個文件(進入某種類型的集合),將新內容添加到集合中,對集合進行排序,並將整個文件寫回(包括新的數據)。一般來說,數據庫是一個易於使用這種事情的_lot_。 – David

回答

2

正如大衛所說,數據庫會使這容易得多。但是,如果你不能使用數據庫(或者有其他理由這樣做),這裏有一種方法來處理它。

使保存的信息小班(使其更容易進行排序,像這樣:

Public Class MovieInfo 

    Public Property As DateTime 
    Public Title As String 
End Class 

接下來,讀取當前文件(如果存在)和填充在它的數據List<MovieInfo>

Dim movies As String() = File.ReadAllLines("C:\Users\Azer\Documents\Movies.txt") 

Dim movieParts = From m in movies 
       Select m.Split(New String() { "/", ":" }, StringSplitOptions.RemoveEmptyEntries) 

Dim parsedDate As DateTime 

Dim movieData As List(Of MovieInfo) = (From mi In movieParts 
             Select New MovieInfo With 
             { 
              .ReleaseDate = _ 
     If(DateTime.TryParseExact(mi(1).Trim, "dd.MM.yyyy", _ 
     System.Globalization.CultureInfo.InvariantCulture, _ 
     System.Globalization.DateTimStyle.None, _ 
     parsedDate), parsedDate, DateTime.MinValue), 
              .Title = mi(3).Trim() 
             }.ToList() 

本質上面的代碼讀取文本文件轉換成一個陣列(每個元素一行),然後使用LINQ將每個線分成4份基於:和/那麼它需要該查詢的結果。並生成一個MovieInfo列表,並將日期字符串轉換爲Dat易於分類的eTime。

DateTime.TryParseExact接收指定格式的輸入字符串(在本例中爲dd.MM.yyyy),並在可能的情況下將其轉換爲DateTime對象。如果成功,則返回true,DateTime值位於parsedDate變量中。如果不是這樣,我使用DateTime的MinValue作爲MovieInfo類的ReleaseDate屬性。

之後,您將從API調用中獲取新數據並將其添加到MovieInfo列表中(您可能希望消除任何重複項)。由於您沒有發佈API中的數據格式,因此我很難給您一個代碼樣本來解析它,但簡而言之,您可以構建第二個MovieInfo對象列表,然後合併現有和新的一起列出。

然後您排序MovieInfo列表並覆蓋原始文本文件。這樣的事情應該做的伎倆:

movieData.Sort(Function(x, y) y.ReleaseDate.CompareTo(x.ReleaseDate)) 

Dim output As New StringBuilder() 

For Each info As MovieInfo in movieData 
    output.Append("Release Date: ") 
    output.Append(info.ReleaseDate.ToString("dd.MM.yyyy")) 
    output.Append("/Title: ") 
    output.Append(info.Title) 
    output.Append(Enviroment.NewLine) 
Next 

File.WriteAllText("C:\Users\Azer\Documents\Movies.txt", output.ToString()) 

此代碼對列表進行排序與​​lambda表達式把日期順序電影(最新到最舊)。然後使用帶有For Each循環的StringBuilder構建輸出,然後將其寫入文件(如果文件已存在,則覆蓋該文件)。

請注意,如果您在排序中反轉x和y,則會按日期變得最早到最新。