2016-01-26 2 views
-1

У меня проблема, которая дает мне головную боль. Я действительно думал, что кто-то спросил об этом уже, но дни чтения и тестирования были бесплодны.VB.net читает текстовый файл и заполняет поле со списком с конкретными извлеченными словами

У меня есть текстовый файл, который начинается:

"Determining profile based on KDBG search... 

    Suggested Profile(s) : WinXPSP2x86, WinXPSP3x86 (Instantiated with WinXPSP2x86)" 

(пустая строка между ними не является ошибкой и ни являются пробелы до «Отдается»)

мне нужно прочитать строку начиная «Предлагаемый ...» и извлекать каждое уникальное слово, начинающееся с «Win», и заполнять с ними поле со списком. (т. е. «WinXPSP2x86» и «WinXPSP3x86»)

Я знаю, что мне нужно использовать класс StreamReader и, вероятно, получить регулярное выражение, но, как новичок, соединяя его все вместе, я до сих пор не знаю ,

Может ли кто-нибудь помочь? Это будет высоко ценится.

+0

Нет необходимости для Regex - просто разделить на пространство и проверять каждую результирующую строку, чтобы увидеть, если он начинается с «Win». – Tim

+0

Если файл не очень большой (скажем, менее 4 МБ, как довольно произвольный размер), вы можете прочитать все это в массив за один раз, используя [File.ReadAllLines] (https://msdn.microsoft.com). /en-us/library/s2tte0y1%28v=vs.110%29.aspx). Это позволяет начать с наличия файлов в вашей программе. –

ответ

0
Imports System.IO 
Public Class Form1 

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 

    ' BASIC is case sensitive and e is parameter so we will start 
    ' new variables with the letter f. 

    ' Read all lines of file into string array F. 
    Dim F As String() = File.ReadAllLines("H:\Projects\35021241\Input.txt") 
    ' F() is a 0 based array. Assign 3 line of file to G. 
    Dim G As String = F(2) 
    ' On line 3 of file find starting position of the word 'win' and assign to H. 
    ' TODO: If it is not found H will be -1 and we should quit. 
    Dim H As Integer = G.IndexOf("Win") 
    ' Assign everything beginning at 'win' on line 3 to variable I. 
    Dim I As String = G.Substring(H) 
    ' The value placed in delimiter will separate remaining values in I. 
    ' Place C after ending quote to represent a single character as opposed to a string. 
    Dim Delimiter As Char = ","C 
    ' J array will contain values left in line 3. 
    Dim J As String() = I.Split(Delimiter) 

    ' Loop through J array removing anything in parenthesis. 
    For L = J.GetLowerBound(0) to J.GetUpperBound(0) 
     ' Get location of open parenthesis. 
     Dim ParenBegin As Integer = J(L).IndexOf("(") 
     ' If no open parenthesis found continue. 
     If ParenBegin <> -1 then 
      ' Open parenthesis found. Find closing parenthesis location 
      ' starting relative to first parenthesis. 
      Dim Temp As String = J(L).Substring(ParenBegin+1) 
      ' Get location of ending parenthesis. 
      Dim ParenEnd As Integer = Temp.IndexOf(")") 
      ' TODO: Likely an exception will be thrown if no ending parenthesis. 
      J(L) = J(L).Substring(0,ParenBegin) & J(L).Substring(ParenBegin + ParenEnd +2) 
      ' Change to include text up to open parenthesis and after closing parenthesis. 
     End If 
    Next L 

    ' UnwantedChars contains a list of characters that will be removed. 
    Dim UnwantedChars As String = ",()""" 
    ' Check each value in J() for presence of each unwanted character. 
    For K As Integer = 0 to (UnwantedChars.Length-1) 
     For L = J.GetLowerBound(0) To J.GetUpperBound(0) 
      ' Declare M here so scope will be valid at loop statement. 
      Dim M As Integer = 0 
      Do 
       ' Assign M the location of the unwanted character or -1 if not found. 
       M= J(L).IndexOf(UnwantedChars.Substring(K,1)) 
       ' Was this unwanted character found in this value? 
       If M<>-1 Then 
        ' Yes - where was it found in the value? 
        Select Case M 
         Case 0 ' Beginning of value 
          J(L) = J(L).Substring(1) 
         Case J(L).Length ' End of value. 
          J(L) = J(L).Substring(0,(M-1)) 
         Case Else ' Somewhere in-between. 
          J(L) = J(L).Substring(0,M) & J(L).Substring(M+1) 
        End Select 
       Else 
        ' No the unwanted character was not found in this value. 
       End If 
      Loop Until M=-1 ' Go see if there are more of this unwanted character in the value. 
     Next L ' Next value. 
    Next K ' Next unwanted character. 

    ' Loop through all the values and trip spaces from beginning and end of each. 
    For L As Integer = J.GetLowerBound(0) To J.GetUpperBound(0) 
     J(L) = J(L).Trim 
    Next L 

    ' Assign the J array to the combobox. 
    ComboBox1.DataSource = J 

End Sub 

End Class 
+0

Это близко и определенно меня трогает. Как и в случае с вышеприведенным предложением, первое слово «Win ..» включает запятую в конце, и, как ни странно, третья запись в combobox есть «(созданная с помощью WinXPSP2x86)», а не только «WinXP ...». Спасибо за сотрудничество, хотя –

+0

Какие значения вы ожидаете в combobox? «WinXPSP2x86» и «WinXPSP3x86 (созданный с помощью WinXPSP2x86» или что-то еще? –

+0

Уильям, это определенно избавилось от нежелательных запятых и скобок - мне нужно будет изучить его, чтобы выяснить, как!Тем не менее, он все же добавляет слова «Имитация» и «с» в поле со списком, но я не понимаю, почему! –

0

Как некоторые уже предложили:

  • Использование System.IO.File.ReadAllLines, если файл не слишком большой
  • перебирать массив строк
  • Для каждой строки, используйте Сплит метод для разделения на пространстве
  • Проверьте первые три буквы каждого слова

Это работает, но делает, конечно, потребуется некоторое эр ROR проверки и т.д.:

 
     Dim lines() As String = System.IO.File.ReadAllLines("c:\temp\example.txt") 

     Dim lineWords() As String 
     For Each line As String In lines 
      lineWords = line.Split(New Char() {" "}, System.StringSplitOptions.RemoveEmptyEntries) 

      For Each word As String In lineWords 
       If word.Length > 3 Then 
        If word.Substring(0, 3).ToUpper = "WIN" Then 
         cmbWords.Items.Add(word) 
        End If 
       End If     
      Next 
     Next 
+0

Еще одно требование от поста OP: «извлечь каждое ** уникальное ** слово, начинающееся« Win » – Tim

+0

@LinusN Спасибо за быстрые ответы все ... Это почти то, что мне нужно. Я могу игнорировать «уникальную» проблему - это не критично, но мне нужно удалить лишние символы, т. Е. Запятая после того, как первое слово, содержащее «Win», перетаскивается, а закрывающая скобка после третьего ... есть простая способ идентифицировать конец слова, если он всегда будет буквенно-цифровым символом ...? Еще раз спасибо –

+0

Ну, добавьте слова в список (из String) вместо коллекции ComboBox Items, и перед добавлением нового слова проверьте, существует ли он в коллекции (проверьте функцию List.Find). Затем назначьте список свойству DataSource для ComboBox. – LinusN