Imports System.io Imports System.Runtime.Serialization.Formatters.Binary Imports System.Runtime.Serialization.Formatters Public Class Form1 Inherits System.Windows.Forms.Form #Region " Windows Form Designer generated code " Public Sub New() MyBase.New() 'This call is required by the Windows Form Designer. InitializeComponent() 'Add any initialization after the InitializeComponent() call End Sub 'Form overrides dispose to clean up the component list. Protected Overloads Overrides Sub Dispose(ByVal disposing As Boolean) If disposing Then If Not (components Is Nothing) Then components.Dispose() End If End If MyBase.Dispose(disposing) End Sub Friend WithEvents Button1 As System.Windows.Forms.Button Friend WithEvents Button2 As System.Windows.Forms.Button Friend WithEvents OpenFileDialog1 As System.Windows.Forms.OpenFileDialog Friend WithEvents Button3 As System.Windows.Forms.Button Friend WithEvents TextBox1 As System.Windows.Forms.TextBox Friend WithEvents MainMenu1 As System.Windows.Forms.MainMenu Friend WithEvents LoadTable As System.Windows.Forms.MenuItem Friend WithEvents FrquencyMenu As System.Windows.Forms.MenuItem Friend WithEvents SaveFileDialog1 As System.Windows.Forms.SaveFileDialog Friend WithEvents SaveBinary As System.Windows.Forms.MenuItem Friend WithEvents SaveSOAP As System.Windows.Forms.MenuItem Friend WithEvents MenuItem1 As System.Windows.Forms.MenuItem Friend WithEvents LoadBinary As System.Windows.Forms.MenuItem Friend WithEvents SaveText As System.Windows.Forms.MenuItem Friend WithEvents LoadText As System.Windows.Forms.MenuItem 'Required by the Windows Form Designer Private components As System.ComponentModel.Container 'NOTE: The following procedure is required by the Windows Form Designer 'It can be modified using the Windows Form Designer. 'Do not modify it using the code editor. Private Sub InitializeComponent() Me.FrquencyMenu = New System.Windows.Forms.MenuItem() Me.SaveBinary = New System.Windows.Forms.MenuItem() Me.SaveText = New System.Windows.Forms.MenuItem() Me.LoadBinary = New System.Windows.Forms.MenuItem() Me.LoadText = New System.Windows.Forms.MenuItem() Me.SaveFileDialog1 = New System.Windows.Forms.SaveFileDialog() Me.TextBox1 = New System.Windows.Forms.TextBox() Me.OpenFileDialog1 = New System.Windows.Forms.OpenFileDialog() Me.Button2 = New System.Windows.Forms.Button() Me.Button3 = New System.Windows.Forms.Button() Me.Button1 = New System.Windows.Forms.Button() Me.MainMenu1 = New System.Windows.Forms.MainMenu() Me.MenuItem1 = New System.Windows.Forms.MenuItem() Me.LoadTable = New System.Windows.Forms.MenuItem() Me.SaveSOAP = New System.Windows.Forms.MenuItem() Me.SuspendLayout() ' 'FrquencyMenu ' Me.FrquencyMenu.Index = 0 Me.FrquencyMenu.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.SaveBinary, Me.SaveText, Me.LoadBinary, Me.LoadText}) Me.FrquencyMenu.Text = "Frequency Table" ' 'SaveBinary ' Me.SaveBinary.Index = 0 Me.SaveBinary.Text = "Save Binary" ' 'SaveText ' Me.SaveText.Index = 1 Me.SaveText.Text = "Save SOAP" ' 'LoadBinary ' Me.LoadBinary.Index = 2 Me.LoadBinary.Text = "Load Binary" ' 'LoadText ' Me.LoadText.Index = 3 Me.LoadText.Text = "Load SOAP" ' 'SaveFileDialog1 ' Me.SaveFileDialog1.FileName = "doc1" ' 'TextBox1 ' Me.TextBox1.Font = New System.Drawing.Font("Verdana", 9.0!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(0, Byte)) Me.TextBox1.Location = New System.Drawing.Point(8, 8) Me.TextBox1.MaxLength = 0 Me.TextBox1.Multiline = True Me.TextBox1.Name = "TextBox1" Me.TextBox1.ReadOnly = True Me.TextBox1.ScrollBars = System.Windows.Forms.ScrollBars.Vertical Me.TextBox1.Size = New System.Drawing.Size(280, 312) Me.TextBox1.TabIndex = 4 Me.TextBox1.Text = "" ' 'Button2 ' Me.Button2.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(161, Byte)) Me.Button2.Location = New System.Drawing.Point(48, 360) Me.Button2.Name = "Button2" Me.Button2.Size = New System.Drawing.Size(192, 23) Me.Button2.TabIndex = 1 Me.Button2.Text = "Show Word Count" ' 'Button3 ' Me.Button3.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(161, Byte)) Me.Button3.Location = New System.Drawing.Point(48, 392) Me.Button3.Name = "Button3" Me.Button3.Size = New System.Drawing.Size(192, 23) Me.Button3.TabIndex = 3 Me.Button3.Text = "Sort Words by Frequency" ' 'Button1 ' Me.Button1.Font = New System.Drawing.Font("Microsoft Sans Serif", 9.75!, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, CType(161, Byte)) Me.Button1.Location = New System.Drawing.Point(48, 328) Me.Button1.Name = "Button1" Me.Button1.Size = New System.Drawing.Size(192, 23) Me.Button1.TabIndex = 0 Me.Button1.Text = "Read Text File" ' 'MainMenu1 ' Me.MainMenu1.MenuItems.AddRange(New System.Windows.Forms.MenuItem() {Me.FrquencyMenu}) ' 'MenuItem1 ' Me.MenuItem1.Index = -1 Me.MenuItem1.Text = "Load SOAP" ' 'LoadTable ' Me.LoadTable.Index = -1 Me.LoadTable.Text = "Load BINARY" ' 'SaveSOAP ' Me.SaveSOAP.Index = -1 Me.SaveSOAP.Text = "Save SOAP" ' 'Form1 ' Me.AutoScaleBaseSize = New System.Drawing.Size(5, 13) Me.ClientSize = New System.Drawing.Size(296, 421) Me.Controls.AddRange(New System.Windows.Forms.Control() {Me.TextBox1, Me.Button3, Me.Button2, Me.Button1}) Me.Menu = Me.MainMenu1 Me.Name = "Form1" Me.Text = "Count Word Frequencies" Me.ResumeLayout(False) End Sub #End Region Dim WordFrequencies As New Hashtable() Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click ' prompt for text file OpenFileDialog1.DefaultExt = "TXT" OpenFileDialog1.Filter = "Text|*.TXT|All Files|*.*" OpenFileDialog1.ShowDialog() If OpenFileDialog1.FileName = "" Then Exit Sub Dim str As StreamReader Dim txtFile As File ' establish a StreamReader object to the file str = File.OpenText(OpenFileDialog1.FileName) Dim txtLine As String Dim Words() As String ' these are the common word delimiters Dim Delimiters() As Char = {CType(" ", Char), CType(".", Char), _ CType(",", Char), CType("'", Char), _ Chr(10), Chr(13)} Me.Text = "Calculating word count" ' read text and store into txtLine variable txtLine = str.ReadToEnd ' break text into individual words and store them into the Words array Words = txtLine.Split(Delimiters) Dim uniqueWords As Integer Dim iword As Integer, word As String ' iterate through all the words and add the unique ones to the SortedList ' Each word is a key for the word's count For iword = 0 To Words.GetUpperBound(0) word = Words(iword).ToUpper If IsValidWord(word) Then ' if word is in the list already, increase its count by 1 ' if not, add the word and set its count to 1 If Not WordFrequencies.ContainsKey(word) Then WordFrequencies.Add(word, 1) uniqueWords += 1 Else WordFrequencies(word) = CType(WordFrequencies(word), Integer) + 1 End If End If Next MsgBox("Read " & Words.Length & " words and found " & _ uniqueWords & " unique words") TextBox1.Clear() End Sub ' This function returns False is the word passed as argument is invalid ' Valid words are made up of letters ("alter-ego" is not a valid word, for example) Protected Function IsValidWord(ByVal word As String) As Boolean If Trim(word).Length = 0 Then Return (False) End If Dim ch As Char Dim iChar As Integer For iChar = 0 To Len(word) - 1 ch = word.Chars(iChar) If Not System.Char.IsLetter(ch) Then Return (False) End If Next Return (True) End Function Private Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button2.Click Dim wEnum As IDictionaryEnumerator Dim occurrences As Integer Dim allWords As New System.Text.StringBuilder() ' iterate through the list and display words and their count wEnum = WordFrequencies.GetEnumerator While wEnum.MoveNext allWords.Append(wEnum.Key.ToString & vbTab & "-->" & vbTab & wEnum.Value.ToString & vbCrLf) End While TextBox1.Text = allWords.ToString End Sub Private Sub Button3_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button3.Click Dim wEnum As IDictionaryEnumerator Dim Words(WordFrequencies.Count) As String Dim Frequencies(WordFrequencies.Count) As Double Dim allWords As New System.Text.StringBuilder() Dim i, totCount As Integer ' iterate through the list and calculateword frequencies wEnum = WordFrequencies.GetEnumerator While wEnum.MoveNext Words(i) = CType(wEnum.Key, String) Frequencies(i) = CType(wEnum.Value, Integer) totCount = totCount + Frequencies(i) i = i + 1 End While ' display words and their frequencies For i = 0 To Words.GetUpperBound(0) Frequencies(i) = Frequencies(i) / totCount Next Words.Sort(Frequencies, Words) TextBox1.Clear() For i = Words.GetUpperBound(0) To 0 Step -1 allWords.Append(Words(i) & vbTab & "-->" & vbTab & Format(100 * Frequencies(i), "#.000") & vbCrLf) Next TextBox1.Text = allWords.ToString End Sub Private Sub SaveText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveText.Click Dim saveFile As FileStream SaveFileDialog1.DefaultExt = "XML" If SaveFileDialog1.ShowDialog = DialogResult.OK Then saveFile = File.OpenWrite(SaveFileDialog1.FileName) saveFile.Seek(0, SeekOrigin.End) Dim Formatter As Soap.SoapFormatter = New Soap.SoapFormatter() Formatter.Serialize(saveFile, WordFrequencies) saveFile.Close() MsgBox("File saved") End If End Sub Private Sub LoadBinary_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadBinary.Click Dim readFile As FileStream OpenFileDialog1.DefaultExt = "BIN" If OpenFileDialog1.ShowDialog = DialogResult.OK Then readFile = File.OpenRead(OpenFileDialog1.FileName) Dim BFormatter As BinaryFormatter BFormatter = New BinaryFormatter() WordFrequencies = CType(BFormatter.Deserialize(readFile), Hashtable) readFile.Close() MsgBox("Read " & WordFrequencies.Count & " words and their counts ") End If End Sub Private Sub SaveBin(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles SaveBinary.Click Dim saveFile As FileStream SaveFileDialog1.DefaultExt = "BIN" If SaveFileDialog1.ShowDialog = DialogResult.OK Then saveFile = File.OpenWrite(SaveFileDialog1.FileName) saveFile.Seek(0, SeekOrigin.End) Dim Formatter As BinaryFormatter = New BinaryFormatter() Formatter.Serialize(saveFile, WordFrequencies) saveFile.Close() MsgBox("File saved") End If End Sub Private Sub LoadText_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles LoadText.Click Dim readFile As FileStream OpenFileDialog1.DefaultExt = "XML" If OpenFileDialog1.ShowDialog = DialogResult.OK Then readFile = File.OpenRead(OpenFileDialog1.FileName) Dim Formatter As Soap.SoapFormatter Formatter = New Soap.SoapFormatter() WordFrequencies = CType(Formatter.Deserialize(readFile), Hashtable) readFile.Close() MsgBox("Read " & WordFrequencies.Count & " words and their counts ") End If End Sub End Class