0

IMDB api からリリース日とタイトルを取得し、それらを .txt ファイルに保存するプログラムを作成しました...どうにかして日付順に並べることができますか?

ここに画像の説明を入力

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
4

2 に答える 2

2

David が言ったように、データベースを使えばこれがずっと簡単になります。ただし、データベースを使用できない場合 (または、他の理由でこの方法を使用する必要がある場合) には、次の方法があります。

情報を保持する小さなクラスを作成します (並べ替えを簡単にするために、次のようにします。

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()

基本的に、上記のコードはテキスト ファイルを配列 (要素ごとに 1 行) に読み取り、LINQ を使用して各行を : と / に基づいて 4 つの部分に分割します。次に、そのクエリの結果を取得し、並べ替えを簡単にするために日付文字列を DateTime に変換して、MovieInfo の List を作成します。

は、指定された形式 (このDateTime.TryParseExact場合は dd.MM.yyyy) の入力文字列を受け取り、可能であればそれを DateTime オブジェクトに変換します。成功すると true が返され、DateTime 値が parsedDate 変数に格納されます。そうでない場合は、MovieInfo クラスの ReleaseDate プロパティの DateTime に MinValue を使用します。

その後、API 呼び出しから新しいデータを取得し、それを MovieInfo の List に追加します (おそらく重複を排除する必要があります)。API からのデータの形式を投稿していないので、それを解析するためのコード サンプルを提供するのはかなり難しいですが、一言で言えば、MovieInfo オブジェクトの 2 番目のリストを作成し、既存のオブジェクトと新しいオブジェクトをマージすることができます。一緒にリストします。

次に、MovieInfo の List を並べ替えて、元のテキスト ファイルを上書きします。このような何かがうまくいくはずです:

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())

このコードは、ラムダ式を使用してリストを並べ替え、映画を日付順に並べます (新しいものから古いものへ)。次に、For Each ループで StringBuilder を使用して出力を作成し、それをファイルに書き込みます (ファイルが既に存在する場合は上書きします)。

並べ替えで x と y を逆にすると、日付が古いものから新しいものへと変わることに注意してください。

于 2013-06-29T20:11:19.193 に答える