2016-08-05 3 views
0

... databox.text (aus Beispielcode unten) enthält eine große Liste von kombinierten Wörtern (Domänennamen), die zuvor im Programm aufgefüllt wurden. Es gibt 1 pro Zeile. In diesem Beispiel sieht es zunächst wie:Visual Basic-Suchtext für Zeichenfolge, Anzeige der Ergebnisse mit Propercase

thepeople.com 
truehistory.com 
workhorse.com 
whatever.com 
neverchange.com 
... 

Der folgende Code unten den Text innerhalb databox spart bis tlistfiltered.txt und sucht dann tlistfiltered.txt alle Zeilen abzurufen, die eines der Elemente in der Liste enthalten „arr() ", und füllt dann listview (lv) mit den Ergebnissen. Das funktioniert ganz gut, aber die Ergebnisse wie folgt aussehen:

thepeople.com 
truehistory.com 
neverchange.com 
... 

aber was ich brauche, ist die „gefunden string“ (von arr() Liste Proper Fall zu sein, so das Ergebnis wäre:

thePeople.com 
trueHistory.com 
neverChange.com 
Hier

ist der Code ....

Dim s As String = databox.Text 
     File.WriteAllText(dloc & "tlistfiltered.txt", s) 
     databox.Clear() 

     Dim text2() As String = System.IO.File.ReadAllLines(dloc & "tlistfiltered.txt") 

     Dim arr() As String = {"people", "history", "change"} 
     For index1 = 0 To arr.GetUpperBound(0) 

      Dim YesLines() As String = Array.FindAll(text2, Function(str As String) 

                   Return str.Contains(arr(index1)) 

                  End Function).ToArray 

      databox.Visible = True 
      For index2 = 0 To YesLines.GetUpperBound(0) 
       Dim match As String = (YesLines(index2)) & vbCrLf 

            databox.AppendText(match) 
      Next 
     Next 
     s = databox.Text 
     File.WriteAllText(dloc & "tlistfilteredfinal.txt", s) 
     databox.Clear() 
     domains = (From line In File.ReadAllLines(dloc & "tlistfilteredfinal.txt") Select New ListViewItem(line.Split)).ToArray 
     lv.Items.Clear() 
     My.Computer.FileSystem.DeleteFile(dloc & "tlistfiltered.txt") 
     My.Computer.FileSystem.DeleteFile(dloc & "tlistfilteredfinal.txt") 
     BackgroundWorker1.RunWorkerAsync() 
    End Sub 

gibt es eine Möglichkeit, dies im laufenden Betrieb zu tun? ich habe versucht StrConv etc, aber es wird nur die gesamte Linie, um ein ordnungsgemäßen Fall konvertieren. ich will nur die " gefunden "Wort innerhalb der Linie zu con sein .... umgerechnet

edit:

nach @soohoonigan ‚s Antwort zu sehen, herausgegeben i

 databox.Visible = True 
     For index2 = 0 To YesLines.GetUpperBound(0) 
      Dim match As String = (YesLines(index2)) & vbCrLf 

           databox.AppendText(match) 
     Next 
    Next 

dazu:

databox.Visible = True 
      For index2 = 0 To YesLines.GetUpperBound(0) 
       Dim match As String = (YesLines(index2)) & vbCrLf 
       Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo 
       If match.Contains(arr(index1)) Then 
        match = match.Replace(arr(index1), myTI.ToTitleCase(arr(index1))) 
        'StrConv(match, vbProperCase) 
        databox.AppendText(match) 
       End If 
      Next 

und bekam das gewünschte Ergebnis!

Antwort

0

Public Class Form1

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim test As String = "thepeople.com" 
    Dim search As String = "people" 
    Dim myTI As System.Globalization.TextInfo = New System.Globalization.CultureInfo("en-US", False).TextInfo 
    If test.Contains(search) Then 
     test = test.Replace(search, myTI.ToTitleCase(search)) 
     MsgBox(test) 
    End If 
    Me.Close() 
End Sub 

End Class

+0

Dank!Ich habe den Code bearbeitet: – t4nk

0

Ich bin nicht sicher, ob die Notwendigkeit für die Verwendung von Dateien für Zwischenschritte und Löschen von ihnen am Ende zum Beispiel zu verstehen.

  • Erster Schritt: die Linien des Eingangs
    bekommen, die mithilfe der Lines Eigenschaft databox getan werden kann (was ich vermute, ein TextBox oder RichTextBox sein, wenn es nicht der Fall ist können wir noch verwenden Split auf der Text-Eigenschaft)

    Dim lines = databox.Lines ' or databox.Text.Split({Environment.NewLine}, StringSplitOptions.RemoveEmptyEntries) 
    
  • Zweiter Schritt: wir wollen diese Zeilen filtern, um nur diejenigen zu halten, enthält die gesuchten Texte
    Hierzu gibt es mehrere Wege, ein einfacher wäre, eine Linq-Abfrage zu verwenden um das zu bekommen Aufgabe
  • Dritter Schritt: Umwandlung des Ergebnisses des Filters durch Ersetzen des gesuchten Textes durch Großschreibung
    Also setzen wir die gestartete Abfrage fort und fügen eine Projektion (oder Abbildung) hinzu, um die Transformation durchzuführen.
    Wir müssen TextInfo.ToTitleCase dafür verwenden.

    ' See soohoonigan answer if you need a different culture than the current one 
    Dim textInfo = System.Globalization.CultureInfo.CurrentCulture.TextInfo 
    
    Dim query = From word in arr 
          From line in lines 
          Where line.Contains(word) 
          Let transformed = line.Replace(word, textInfo.ToTitleCase(word)) 
          select transformed 
    ' We could omit the Let and do the Replace directly in the Select Clause 
    
+0

Ich sehe, was Sie sagen, mein Code ist sehr ineffizient ... krank nehmen Sie Ihre Antwort und versuchen, so zu implementieren ... – t4nk

Verwandte Themen