2016-05-10 12 views
0

Ich habe eine Textdatei, die Informationen enthält, die ich suchen und ersetzen möchte, und in einer neuen Datei speichern. Die Textdatei ist voll mit einer Menge Text, aber irgendwo enthält sie eine Ansichtsnummer wie unten.Suche eine Textdatei für unbekannten Text in vb.net

- " Name="View 12" 
- A few lines lower down it will contain: 
-" Name="View 21" 

Ich brauche für die erste Ansicht Namen suchen zu können (in der Reihenfolge ist es in der Textdatei, nicht in numerischer Reihenfolge der Ansichten), und ersetzen Sie die ersten Namen mit „Seite 1“, die zweiter Name mit "Seite 2", dritter mit "Seite 3" etc.

Im Moment verwende ich eine Replace-Funktion, um das Zeichen zu finden und durch ein neues Zeichen zu ersetzen.

Ich kann den "Ansicht" Teil zu "Seite", aber nicht die Nummer ändern. Hier ist der Code dafür, den ich im Moment habe. Ich weiß nicht, wie man nach der Ansichtsnummer sucht, da es alles Mögliche sein kann. Es könnte sein, weil ich die Schleifen durcheinander gebracht habe, oder dass ich nicht die richtigen Funktionen verwende. Hat jemand irgendwelche Ideen oder Vorschläge? Vielen Dank.

Dim oldChar As String 
    Dim newViewName As String 

    For anInt = 1 To 40 

     oldChar = ("Name=""View " & anInt) 
     newViewName = ("Name=""Page " & i) 

     While anInt = 1 
      fileReader = My.Computer.FileSystem.ReadAllText("C:\Documents\Views.txt").Replace(oldChar, newViewName) 
      My.Computer.FileSystem.WriteAllText("C:\Documents\New.txt", fileReader, False) 
      anInt = 2 
      i = 2 
     End While 

     fileReader = My.Computer.FileSystem.ReadAllText("C:\Documents\New.txt").Replace(oldChar, newViewName) 
     My.Computer.FileSystem.WriteAllText("C:\Documents\New.txt", fileReader, False) 
     i = i + 1 
    Next anInt 

UPDATE:

Das Problem, das ich immer mit der Nummerierung ist. Wenn die Reihenfolge der Ansichten im Text

- View 1 
- View 3 
- View 5 
- View 7 

Dann kann ich glücklich die "Ansicht" ändern. Aber die Anzahl ändert sich nicht in der Reihenfolge. Es bleibt in der gleichen Reihenfolge, 1,3,5,7 in diesem Fall. Ich möchte, dass es liest:

+0

So haben Sie eine Textdatei, die voll von allem sein könnte, aber irgendwo gibt es 'Name =" View 12 "' und weiter unten 'Name =" View 21 "', usw. Sie möchten jeden durch ersetzen Seite X, je nachdem, in welcher Reihenfolge sie sind? – p3tch

+0

Richtig, abhängig von der Reihenfolge, in der sie in der Datei angezeigt werden, während Sie nach unten scrollen. Nicht in der Reihenfolge der Ansichtsnummern – JS16

+0

Und es ist immer "Name", oder ändert sich der Name tatsächlich? – p3tch

Antwort

0

Da wir nicht wissen, wie Ihre Textdatei genau aussieht, ist es schwer, gute Beratung zu geben. Ich würde jedoch die Textdatei in eine Zeichenfolge lesen und dann die Textdatei teilen. Ich würde dann die Funktion contains verwenden, um Name zu finden. Dieses Stück Schnur würde ich mit dem neuen Text ersetzen und das nächste Array-Element würde ich durch die Nummer ersetzen. Hier

ein Beispiel:

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    Dim oldtext1 As String 
    Dim newViewName As String 
    Dim i As Integer = 0 
    Dim counter As Integer = 0 
    Dim testext As String = "" 
    Dim str As String() 
    oldtext1 = "Name=""View " 
    newViewName = ("Name=""Page ") 
    testext = My.Computer.FileSystem.ReadAllText("C:\Users\gerhard\Desktop\test1.txt") 
    str = testext.Split(" "c) 
    For i = 0 To str.Length - 1 
     If str(i).Contains("Name") Then 
      counter += 1 
      str(i) = "Name=""Page " 
      str(i + 1) = counter.ToString 
     End If 
    Next 
    For Each word As String In str 
     Debug.Print(word) 
    Next 

End Sub 
0

Edit:

Das Problem ist, dass Sie i erhöht jedes Mal, wenn eine Schleife durch anInt. Sie müssen es so, dass nur erhöht, wenn ein Ersatz Ort

If My.Computer.FileSystem.ReadAllText("C:\Documents\New.txt").Contains("Name=""View " & anInt) Then i += 1 

nahm wie minimalistisch gesagt, ein wenig mehr Info wäre hilfreich

ich gerade durch jede Zeile der Textdatei geschlungen haben. Wenn es die übereinstimmende Zeichenfolge enthält, ersetzen Sie sie. In jedem Fall wird die Zeile in die neue Datei geschrieben.

Dim sr As IO.StreamReader 
    Dim filename As String = System.IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "Views.txt") 
    Dim newfilename As String = System.IO.Path.Combine(My.Computer.FileSystem.SpecialDirectories.MyDocuments, "new.txt") 
    Dim newfile As System.IO.StreamWriter = My.Computer.FileSystem.OpenTextFileWriter(newfilename, True) 
    Dim pageNumber As Integer = 1 

    If IO.File.Exists(filename) Then 
     sr = IO.File.OpenText(filename) 

     Do While sr.Peek <> -1 
      Dim thisLine As String = sr.ReadLine 
      If thisLine.Contains("Name=""View ") Then 
       newfile.WriteLine(thisLine.Replace("Name", "Page " & pageNumber.ToString)) 
       pageNumber += 1 
      Else 
       newfile.WriteLine(thisLine) 
      End If 
     Loop 
     sr.Close() 
     newfile.Close() 
    End If 

Dies wurde unter der Annahme durchgeführt Name= werden auf verschiedenen Linien sein, wie Sie sagten, sie würden sein.

Wenn Sie sicher sein wollen, würde ich vermeiden .Replace und betrachten Entfernen und Einfügen von Teilstrings, um versehentlich zu ersetzen, etwas, was Sie nicht sein sollten.

+0

Ich habe diesen Code sowie was Minimalist gesagt. Sie geben beide dasselbe aus, was ich vorher bekommen habe. Ich werde meine Frage bearbeiten und erklären ... – JS16

+0

Das Problem ist der Teil des Codes, der 'newfile.WriteLine (thisLine.Replace (" Name "," Page "& pageNumber.ToString))' 'sagt. Wir wollen nicht den Teil "Name" ersetzen, sondern den String, der hinter dem Zeichen = steht, wobei Name = "View 1" – JS16

+0

Vergiss meine alte Antwort, deine sollte funktionieren, wenn du 'i' richtig erhöhst. Gerade jetzt, "ich" könnte auch "anInt" in Ihrem Code sein – p3tch

Verwandte Themen