2014-11-30 3 views
0

Мне нужна помощь, чтобы выяснить, как справиться с этой проблемой. Код, который я пытаюсь сделать, принимает две введенные пользователем строки, открывает/ищет файл txt и подсчитывает, сколько раз упоминаются эти две строки.Проблема с подсчетом нескольких слов в строке

С кодом, который у меня есть до сих пор, он не учитывает несколько строк в одной строке. Напр. если я ищу «Боб», а в одной строке есть два экземпляра Боба, он будет считать только один экземпляр. Это очень озадачивает, и любая помощь будет оценена по достоинству. Благодарю.

Dim inFile As IO.StreamReader 
    Dim String1 As String 
    Dim Count1 As Integer 
    Dim Count2 As Integer 
    Dim Text1 As String = TextBox1.Text.ToUpper 
    Dim Text2 As String = TextBox2.Text.ToUpper 

    String1.Text = "" 
    String2.Text = "" 

    If IO.File.Exists("C:\names.txt") Then 
     inFile = IO.File.OpenText("C:\names.txt") 

     While Not inFile.EndOfStream 
      String1 = inFile.ReadLine() 

      If String1.ToUpper.Contains(Text1) Then 
       Count1 += 1 
       If String1.ToUpper.Contains(Text2) Then 
        Count2 += 1 
       End If 
      End If 
     End While 
     inFile.Close() 
    Else 
     MessageBox.Show("xx", 
         "xx", 
         MessageBoxButtons.OK) 
    End If 


    String1.Text = Count1.ToString 
    String2.Text = Count2.ToString 
End Sub 
+0

Одна из проблем заключается в том, что Содержит слева направо от начала строки, повторяя тот же ИФ, который не поймает второе появление (если существует). Я предлагаю вам использовать другую функцию, такую ​​как IndexOf: http://msdn.microsoft.com/en-us/library/2y7ddk24.aspx – NoChance

+0

Я попытался использовать IndexOf, но полученный результат оказался намного большим, чем реальное число. Измененный код выглядит так: «Если String1.ToUpper.IndexOf (Text1) then». Я также пытался использовать подстроки, но это также выдает ошибки. Возможно, я сделал это неправильно, хотя ... – Envygood

ответ

0

Вот пример, близкий к вашему случаю (вы можете адаптировать его с помощью имен переменных). Кроме того, рекомендуется использовать логику в отдельном методе/функции и вызывать ее из основного цикла.

Dim inputS, upperS,searchArg, upperSearchArg AS String 
    Dim pos,howMany As Integer 
    pos=0 'initialize the start position 
    howMany=0 
    searchArg="Bob " 'use a trailing space if you don't want to find bobby 
    upperSearchArg=searchArg.ToUpper() 
    inputS="Andrew and Bob are nice but bob is weird some times:" 
    upperS=inputS.ToUpper() 
    Do  
     pos=upperS.IndexOf(upperSearchArg,pos) 'here we use a variable start position 
     if (pos > -1) 
      Console.WriteLine("Found one occurence at:" + pos.ToString()) 
      howMany=howMany+1 
      pos=pos+1 'change the start position 
     else 
      'pos is -1 here 
      exit do 
     End if 
    Loop 
    Console.WriteLine("Total Founds:"+howMany.toString()) 

Обратите внимание, что приведенный выше код не будет найти «Боб» в строке, которая заканчивается с «Bob» без задней пустым. Это должно быть легко исправить.

Существуют и другие методы, используемые для сопоставления нескольких строк, например, с использованием LINQ.

Смежные вопросы