RosettaCodeData/Task/Rosetta-Code-Rank-languages-by-popularity/Visual-Basic-.NET/rosetta-code-rank-languages-by-popularity.vb

99 lines
3.5 KiB
VB.net
Raw Permalink Normal View History

2023-09-16 17:28:03 -07:00
Imports System.Collections
Imports System.Collections.Generic
Imports System.Net
Imports System.Text.RegularExpressions
Module RankLanguagesByPopularity
Private Class LanguageStat
Public name As String
Public count As Integer
Public Sub New(name As String, count As Integer)
Me.name = name
Me.count = count
End Sub
End Class
Private Function CompareLanguages(x As LanguageStat, y As languageStat) As Integer
Dim result As Integer = 0
If x IsNot Nothing Or y IsNot Nothing Then
If x Is Nothing Then
result = -1
ElseIf y Is Nothing
result = 1
Else
result = - x.count.CompareTo(y.count) ' Sort descending count
If result = 0 Then
result = x.name.CompareTo(y.name) ' Sort ascending name
End If
End If
End If
Return result
End Function
Public Sub Main(ByVal args As String())
Dim languages As New List(Of LanguageStat)
Dim basePage As String = "https://rosettacode.org/wiki/Category:Programming_Languages"
Dim nextPage As String = basePage
Dim nextPageEx = New RegEx("<a href=""/wiki/Category:Programming_Languages([?]subcatfrom=[^""]*)""")
Dim languageStatEx = _
2025-02-27 18:35:13 -05:00
New Regex(">([^<]+?)</a></bdi> *<span title=""Contains *[0-9,.]* *[a-z]*, *([0-9,.]*) *page")
2023-09-16 17:28:03 -07:00
Do While nextPage <> ""
Dim wc As New WebClient()
2025-02-27 18:35:13 -05:00
' Ensure the WebClient has a User-Agent.
Dim hasAgent As Boolean = False
for hPos As Integer = 0 To wc.Headers.Count - 1
Dim headerKey As String = wc.Headers.GetKey(hPos)
hasAgent = hasAgent Or headerKey = "User-Agent"
Next hPos
If not hasAgent Then
wc.Headers.Add("User-Agent", "RC_Tasks_Agent")
End If
Dim page As String = wc.DownloadString(nextPage)
2023-09-16 17:28:03 -07:00
nextPage = ""
For Each link In nextPageEx.Matches(page)
nextPage = basePage & link.Groups(1).Value
Next link
For Each language In languageStatEx.Matches(page)
Dim lCount As Integer = 0
Dim lName As String = language.Groups(1).Value
Dim countText As String = language.Groups(2).Value.Replace(",", "").Replace(".", "")
If Not Integer.TryParse(countText, lCount)
Console.Out.WriteLine(lName & "Invalid page count: <<" & countText & ">>")
Else
languages.Add(New LanguageStat(lName, lCount))
End If
Next language
2025-02-27 18:35:13 -05:00
If nextPage <> "" Then
' Sleep for a while to avoid looking like a DOS attack...
System.Threading.Thread.Sleep(500)
End If
2023-09-16 17:28:03 -07:00
Loop
languages.Sort(AddressOf CompareLanguages)
Dim prevCount As Integer = -1
Dim prevPosition As Integer = -1
Dim position As Integer = 0
For Each stat As LanguageStat In languages
position += 1
If stat.count <> prevCount Then
prevPosition = position
prevCount = stat.Count
End If
Console.Out.WriteLine(prevPosition.ToString.PadLeft(4) & ": " &
stat.count.ToString.PadLeft(4) & " " & stat.name)
Next stat
End Sub
End Module