Zeile ersetzen und nach String suchen

  • VB.NET

Es gibt 10 Antworten in diesem Thema. Der letzte Beitrag () ist von RodFromGermany.

    Zeile ersetzen und nach String suchen

    Hallo,

    ich bin mal wieder auf der Suche nach einer Lösung:

    Folgende Bezeichnung will ich ändern "alt" in "neu". Ich weiß zwar das es mit dem Streamwriter funktionieren sollte bin aber nicht sicher, wie ich dann den "Ersetzen" Befehl definiere? Bzw. das durchlaufen der Überprüfung nach den alten Werten, um sie mit den Neuen zu ersetzen. Freue mich über Feedback. :)

    VB.NET-Quellcode

    1. DIM OP As String = "C:\Test.txt"
    2. Dim alt1 As String = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"
    3. Dim alt2 As String = "<ns1:OrthesenDS xmlns:ns1=""http://tempuri.org/OrthesenDS.xsd"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">"
    4. Dim alt3 As String = "ns1:"
    5. Dim neu1 As String = "<?xml version=""1.0"" standalone=""yes""?>"
    6. Dim neu2 As String = "<OrthesenDS xmlns=""http://tempuri.org/OrthesenDS.xsd"">"
    7. Dim neu3 As String = ""
    8. Dim sr As IO.StreamReader = IO.File.OpenText(OP)
    @EaranMaleasi :) wenn es nur das ist :). Wird die Datei dann automatisch nach der gesuchten Quelle durchsucht? Ich dachte da müsste dann noch eine Schleife hinein, die alle Zeilen der Datei durchsucht?!
    alt1 steht in der ersten Zeile, alt2 steht in der zweiten Zeile und alt3 kommt in jeder Zeile vor.

    PS: Habe sowas ähnliches gefunden und umgeändert aber es passiert irgendwie nichts. Habe ich etwas wichtiges vergessen? :)

    VB.NET-Quellcode

    1. Dim op As String = "C:\Test.txt"
    2. Dim i As Integer
    3. Dim alt(2) As String
    4. alt(0) = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"
    5. alt(1) = "<ns1:OrthesenDS xmlns:ns1=""http://tempuri.org/OrthesenDS.xsd"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">"
    6. alt(2) = "ns1:"
    7. Dim neu(2) As String
    8. neu(0) = "<?xml version=""1.0"" standalone=""yes""?>"
    9. neu(1) = "<OrthesenDS xmlns=""http://tempuri.org/OrthesenDS.xsd"">"
    10. neu(2) = ""
    11. For i = 0 To 2
    12. For Each s As String In op
    13. If s.Contains(alt(i)) Then s.Replace(alt(i), neu(i))
    14. Next
    15. Next

    Dieser Beitrag wurde bereits 6 mal editiert, zuletzt von „Sam85“ ()

    Bei String.Replace("","") muss man nix suchen und braucht keine Schleife. Das macht die Methode selber. Einfach drüber ballern und gut is.
    "Gib einem Mann einen Fisch und du ernährst ihn für einen Tag. Lehre einen Mann zu fischen und du ernährst ihn für sein Leben."

    Wie debugge ich richtig? => Debuggen, Fehler finden und beseitigen
    Wie man VisualStudio nutzt? => VisualStudio richtig nutzen

    Sam85 schrieb:

    VB.NET-Quellcode

    1. For Each s As String In op
    op ist ein Dateiname.
    Falls Du den Inhalt der Datei meinst, must Du ihn zunächst laden.

    VB.NET-Quellcode

    1. Dim lines = IO.File.ReadAllLines(op)
    2. lines[0] = lines[0].Replace(alt(0), neu(0))
    3. lines[1] = lines[1].Replace(alt(1), neu(1))
    4. lines[2] = lines[2].Replace(alt(2), neu(2))
    5. ' und wieder speichern
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    @mrMo

    du meinst also, wenn ich Replace auf einen String anwende (nicht als Code String.Replace :)) dann benötige ich keine Schleife. Wenn ich nun aber die Datei nach einen Wert durchsuchen muss weil er mehrmals an verschiedenen Positionen vorkommt, wie wird der Befehl dann ausgeführt? Oder werden die Segmente automatisch erkannt und das bis zum Ende der Datei? Wie stelle ich dann den Code zusammen?

    VB.NET-Quellcode

    1. For i = 0 To 2
    2. ToString.Replace(alt(i), neu(i))
    3. Next


    @RodFromGermany Es wird ein Bezeichner erwartet? (ich habe "lines" als Object deklariert, da strict es sonst nicht zulässt, stimmt das so?)

    VB.NET-Quellcode

    1. Dim lines As Object = IO.File.ReadAllLines(OP)
    2. lines[0] = lines[0].replace(alt(0), neu(0))


    Mach ich es so, kommt die Meldung das spätes binden nicht zugelassen wird.

    VB.NET-Quellcode

    1. Dim lines As Object = IO.File.ReadAllLines(OP)
    2. lines(0) = lines(0).replace(alt(0), neu(0))


    Tut mir leid wenn ich nicht alles sofort richtig umsetze oder den Ansatz falsch verstehe || , danke für eure Hilfe.
    @mox Dadurch landen wir beim selben Problem, für das wir nun lediglich mehr Werkzeuge haben (XDocument/XmlDocument/XPath), ob diese jedoch benötigt werden lässt sich auch ohne XML-Datei klären.

    @Sam85 Du solltest schon deine Dateitypen genau kennen. Aus der .ReadAllLines() Funktion kommt z.B. kein Object heraus sondern?
    Deklariere deine Variablen entsprechend.
    Außerdem musst du, wenn du mit ReadAllLines arbeitest, auch tatsächlich alle Lines durchgehen, und nicht nur die ersten 3.
    Hierfür würde sich ForEach anbieten.
    Mit ReadAllText bekommst du einen String, der den gesamten Text einer Datei beinhaltet. dort kannst du dann mit der Replace-Funktion alle Vorkomnisse auf einen Schlag ersetzen.

    VB.NET-Quellcode

    1. DIM OP As String = "C:\Test.txt"
    2. Dim t As String = IO.File.ReadAllText(OP)
    3. Dim i As Integer
    4. Dim alt(2) As String
    5. alt(0) = "<?xml version=""1.0"" encoding=""UTF-8"" standalone=""yes""?>"
    6. alt(1) = "<ns1:OrthesenDS xmlns:ns1=""http://tempuri.org/OrthesenDS.xsd"" xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"">"
    7. alt(2) = "ns1:"
    8. Dim neu(2) As String
    9. neu(0) = "<?xml version=""1.0"" standalone=""yes""?>"
    10. neu(1) = "<OrthesenDS xmlns=""http://tempuri.org/OrthesenDS.xsd"">"
    11. neu(2) = ""
    12. For i = 0 To 2
    13. t= t.replace(alt(i), neu(i))
    14. Next
    15. File.WriteAllText(OP, t)
    @mox ja das mache ich, die XML kommt aus Excel und hat leider diese Konvertierungen dabei. Daher wollte ich sie manuell entfernen, sonst wird sie nicht korrekt als DB geladen.
    Ist aber eine andere Geschichte, die ich in einen anderen Thread bereits besprochen habe. :)

    @Eierlein Vielen Dank :) das hat so funktioniert. :thumbsup: und danke das du mir erklärt hast, was mrMo mir zu verstehen geben wollte mit dem Replace.String und den Ansatz von RodFromGermany.

    @EaranMaleasi Ja das war mein Problem was ich auch RodFromGermany gefragt hatte, ob es überhaupt ein "Object" ist (das ich es nicht richtig bestimmt habe, liegt an meinem noch nicht vorhandenen Wissen).
    Aber Danke für den Hinweis, bin leider noch etwas zu grün. ^^

    Sam85 schrieb:

    Es wird ein Bezeichner erwartet?
    Wenn Du die hier im Forum üblichen Einstellungen verwendest:

    wird kein Bezeichner erwartet und mein Code läuft exakt so, wie er da steht, mit Option Strict On.
    Option Infer On macht, dass bei Dim lines = IO.File.ReadAllLines(op) => lines automatisch als String-Array erkannt wird.

    Befleißige Dich also der hier üblichen Einstellungen, gugst Du hier, dann brauchst Du in den meisten Fällen keine Rückfragen mehr. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!