Textdatei durchsuchen und...

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von hasi63.

    Textdatei durchsuchen und...

    Hallo zusammen
    leider werde ich mit dem Googel finden nicht richtig schlau, darum meine Frage hier...

    Ich habe eine Text Datei welche ich nach einem Wert durchsuchen will ob diese Vorhanden ist.

    VB.NET-Quellcode

    1. Dim AnzahlGefundeneLinien = 0
    2. Dim dlg As New OpenFileDialog()
    3. Dim Linie As String = 0
    4. Dim Suchstring
    5. Dim result As DialogResult = New DialogResult()
    6. Dim OpenFileDialog1 As New OpenFileDialog()
    7. OpenFileDialog1.Filter = "Konfig|*.config" 'Textdatei mit Endung *.config suchen
    8. OpenFileDialog1.InitialDirectory = "C:\"
    9. OpenFileDialog1.FileName = ""
    10. result = OpenFileDialog1.ShowDialog()
    11. lblPfad.Text = OpenFileDialog1.FileName
    12. ' Gibt es <Settings> bereits, dann abbrechen
    13. Suchstring = "<Settings>"
    14. For Each Line As String In IO.File.ReadAllLines(lblPfad.Text)
    15. If Line.Contains(Suchstring) Then
    16. AnzahlGefundeneLinien = AnzahlGefundeneLinien + 1
    17. End If
    18. Linie += 1
    19. Next
    20. ' Meldung wenn es den Eintrag für die Eintrag schon gibt.
    21. If AnzahlGefundeneLinien <> 0 Then
    22. MsgBox("ACHTUNG: " & Suchstring & " " & AnzahlGefundeneLinien & " mal gefunden" & vbCrLf & vbCrLf & "Die Konfig kann nicht automatisch erstellt werden")
    23. End If


    Das ganze ist soweit auch I.O.
    Nun möchte ich aber den Wert "Konfiguration" suchen und davor eine Linie einfügen (Text "Konfiguration" gibt es zu 1000%)

    Also in etwa so:
    search "Konfiguration"
    Wenn GefundeneZeile = "Konfiguration" dann
    Einfügen (GefundeneZeile -1) insert "Text1"

    Zusätzlich müssen auch mehrere Zeilen, nach dem Suchbegriff, eingefügt werden... Also etwa so:

    search "Konfiguration"
    Wenn GefundeneZeile = "Konfiguration" dann
    Einfügen (GefundeneZeile +1) insert "Text2"
    Einfügen (GefundeneZeile +2) insert "Text3"
    Einfügen (GefundeneZeile +3) insert "Text4"

    Gleichzeitig möchte ich auch die Zeile ausgeben (lblGefundeneZeile.txt = GefundeneZeile) in welcher "Konfiguration" gefunden wurde damit ich dies auch klar angeben kann...

    Kann mir das jemand etwas beschreiben damit auch ich als anfänger dies verstehe :D ? Ich möchte ja ein bisschen Lernen 8o

    Gruss

    Harry

    hasi63 schrieb:

    Ich möchte ja ein bisschen Lernen
    Gut, denn es geht gleich ganz oben los:

    hasi63 schrieb:

    Das ganze ist soweit auch I.O.
    Ne, garantiert nicht:
    Zeile#2: Dim Linie As String = 0 WTF?!? Bevor Du weitermachst, bitte die empfohlenen VS-Einstellungen verwenden. Stichwort Option Strict On und MsgBox

    hasi63 schrieb:

    Text "Konfiguration" gibt es zu 1000%
    Was ist das für eine erhöhte Sicherheit gegenüber 100%? Lass trotzdem einen Test laufen, ob dieses Wort vorkommt. Ich schreibe aus Erfahrung …

    zum weiteren Problem (was Du machen kannst, nachdem Du den Link beherzigt und dann alle Fehler beseitigt hast):
    Der Anfang ist also gemacht, das Einlesen funktioniert. Danach erstellst Du eine List(Of String), kopierst dort Zeile für Zeile aus Deiner Datei und wenn Du eben z.B. bei Konfiguration angekommen bist, fügst Du Deine zusätzlichen Daten ein und machst dann weiter mit der Übertragung der Quelldateizeilen. Am Ende schreibst Du die Daten der List in eine Datei. Aber nicht gleich in die Originaldatei, sondern erstmal in eine Kopie, die Du dann mit dem Original vergleichen kannst. Das mit dem Zeilenindex merken: Leg ne Integervariable an und wenn Du eben bei Konfiguration angekommen bist, setze den Wert der Variable. Dazu wäre es aber sinnvoller, aus der For-Each-Schleife eine normal For-Schleife zu machen.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @hasi63

    Als erstes würde ich die Datei nicht zeilenweise einlesen (IO.File.ReadAllLines()), sondern in einem Stück:

    VB.NET-Quellcode

    1. Dim ConfigFileContent As String = System.IO.File.ReadAllText(lblPfad.Text)


    nun splittest Du den Dateiinhalt nach Zeilenumbruch (Environment.NewLine) in eine List:

    VB.NET-Quellcode

    1. Dim Lines As List(Of String) = Split(myConfig, Environment.NewLine).ToList()


    und kannst die Zeilen mittels einer Counter-Variable durchlaufen und bei Bedarf ein Insert() durchführen:

    VB.NET-Quellcode

    1. For LineCounter As Integer = 0 To Lines.Count - 1
    2. Dim Line As String = Lines(LineCounter)
    3. If Line.Contains("Konfiguration") Then
    4. Lines.Insert(LineCounter, "Text1")
    5. LineCounter += 1
    6. End If
    7. Next


    Grüße ... Peter
    @PeterT Was soll der Unsinn?
    Einlesen als Text und dann in Zeilen splitten?
    Was, wenn in der Datei andere Zeilenendungen drinne sind?
    ====
    @hasi63 Dein Code versagt, wenn Du den OpenFileDialog mit Cancel beendest :!:
    Ansonsten gehe ich mit @VaporiZed , kopiere jede Zeile in eine List(Of String), und wenn Du fündig bist, kopiere das, was zusätzlich reinb soll, vor oder nach der besagten Zeile rein und speichern und feddich.
    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!
    Es ging ihm wohl darum, nur eine List(Of String) zu haben. Allerdings hätte man das auch mit ReadAllLines geschafft. Und = Split(myConfig, Environment.NewLine) ist VB6
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.
    @VaporiZed
    Das sind doch schon mal fragen die ich etwas beantworten kann:

    Was ist das für eine erhöhte Sicherheit gegenüber 100%?

    Tippfehler.... Wenn mann am morgen etwas blind ist. Zudem gibt es den Eintrag so sicher wie der Tod am Ende des lebens....
    Ansonsten würde das Programm, welches diese Konfig verwendet, nicht laufen...

    Dim Linie As String = 0

    Never Change a Runnig System.... Klar, hier müsste ich
    Dim Linie As String
    Linie = 0
    schreiben, oder? Übrigens auch im vb-paradis sind solche sachen zu finden ohne das bissher sich jemand daran stört...

    Wenn ich Option Strict On umstelle habe habe ich viele "unsinniges"... Ok. Ja, werde ich im nächsten Projekt einbauen. Das projekt jetzt soll aber mal einfach laufen...
    Jaja, belehrungen braucht es, aber es nervt wahnsinnig wenn man statt antworten nur zu hören bekommt "lies doch..." oder noch besser "das weiss man doch..."

    Ok. Ok. ich bin Lernfähig, aber ich möchte nicht das ganze wieder auf ausganspunkt eins zurücksetzten nur weil ich Codes falsch gemacht habe....
    Er motzt mir nun sofort an das folgender Eintrag auch nicht korrekt sei:
    txtOrganisationsID.MaxLength = My.Settings.OrganisationAnzahlStellen
    Warum auch immer....

    Hier will ich aber im moment wirklich nicht nacharbeiten weil, es läuft (ja, blöde aussage, aber für mich stimmt es). Aber geplant ist dies augrund deiner rückmeldung.

    Du siehst..... Ich stehe wirklich am anfang und möchte nicht gleich eine Komplettes Studium machen, aber dennoch will ich Lernen (was nicht heisst das ich perfekt sein muss/will)

    Ich probiere aber mal deine Inputs umzusetzten...
    Danke dir.

    @RodFromGermany
    Dein Code versagt, wenn Du den OpenFileDialog mit Cancel beendest

    Ist mir noch nicht aufgefallen... Aber könnte sein... ich stehe da wirklich noch am anfang und eigentlich ist dies das kleinste Problem, aber es ist sicher auch eines... =O

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „hasi63“ ()

    hasi63 schrieb:

    Never Change a Runnig System.... Klar, hier müsste ich
    Dim Linie As String
    Linie = 0
    schreiben, oder?

    Nein. Wenn es darum ginge, ist die bestehende Variante besser, da Einzeiler. Aber: Ein String stellt einen Text dar, aber 0 ist eine Zahl. Das ist das Problem. Was ergibt 2 + 1 und was ergibt "2" + "1"? Richtig! Etwas anderes. Was dazukommt: Es gibt nicht wenige hier, die die Hilfe einstellen oder gar nicht erst damit anfangen, wenn der Hilfesuchende elementare Bestandteile der Selbsthilfe ignoriert. Deine Entscheidung.
    Aber Du hast ja schon ein paar Lösungsvorschläge bekommen. Vielleicht reicht es ja schon.
    Dieser Beitrag wurde bereits 5 mal editiert, zuletzt von „VaporiZed“, mal wieder aus Grammatikgründen.

    Aufgrund spontaner Selbsteintrübung sind all meine Glaskugeln beim Hersteller. Lasst mich daher bitte nicht den Spekulatiusbackmodus wechseln.

    PeterT schrieb:

    scharfer Wind.
    Jou. :D
    Das Problem aller Sich-Neu-mit-.NET-Beschäftigenden und -Beschäftigendinnen:
    Jeder glaubt, dass er als Erster auf ein Problem gestoßen sei und dass demzufolge das Framework dafür keine "bessere" Lösung (es muss nicht unbedingt eine in sich geschlossene Lösung sein) bereit hält.
    Nimm einfach an, dass alles schon mal da war und dass Du es nur noch nicht gefunden hast. ;)
    Und genau hier beginnt der Unterschied zwischen Suchen und Finden ...
    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!
    @VaporiZed
    Huiuiui.. Was für ein fehler... Uff.. Klaro. Jetzt ist sofort der Groschen (soory. ich bin Schweizer), der Rappen, gefallen...

    Manchmal könnte es doch so einfach sein wenn mann die Augen öffnet *lol*
    Dake für den Hinweis.

    @RodFromGermany und @PeterT
    der wind der wind das himmlische Kind
    :D :)
    Ich bin froh um jeden Hinweis das ich noch etwas von meiner C64 Basic Zeit falsch mache. Korrekturen folge, aber nicht sofort denn im Alter ist man halt nicht mehr der Schnellste...

    @alle
    danke mal für die Tipps, ich probiers mal und melde mich dann wieder.

    Gruss

    Harry

    PS: weitere Tipps sind immer willkommen :thumbsup: .
    hier noch eine Variante
    die Originaldatei wird nicht verändert, die Suche und Ergebnis der Suche
    wird in eine "Ergebnis.txt" geschrieben

    VB.NET-Quellcode

    1. Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    2. Dim currentLineNumber As Integer = 0
    3. Using Writer As New System.IO.StreamWriter("E:\Ergebnis.txt") 'schreibe ZeilenNr. und Zeilen Text
    4. Using reader As New StreamReader("E:\SucheInDatei.txt") 'suche in diese Textdatei
    5. While Not reader.EndOfStream
    6. Dim line As String = reader.ReadLine()
    7. currentLineNumber += 1
    8. If line.Contains("deinSuchtext") Then
    9. 'was gefunden ?, dann schreibe die Zeilennummer und Zeilen Text
    10. Writer.WriteLine("in Zeile(" & currentLineNumber & ") Text gefunden = " & line)
    11. End If
    12. End While
    13. End Using
    14. End Using
    15. End Sub