Strings aus txt.Datei lesen, speichern und an definierter Stelle wieder einfügen

  • VB.NET
  • .NET (FX) 4.5–4.8

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

    Strings aus txt.Datei lesen, speichern und an definierter Stelle wieder einfügen

    Hallo zusammen,

    benötige mal wieder eure Hilfe.

    Ich habe mehrere Textdateien in folgendem Format vorliegen (Der Auszug unten ist aus einer Textdatei):

    %4711
    N1
    N2
    N3
    N4
    N5
    N6%4712

    %4712
    N7
    N8
    N9
    N10%4713

    %4713
    N11
    N12
    N13
    N14 G99


    Ich möchte die Zeilen nach den Prozentzeichen speichern und alle in dem ersten Absatz einfügen, Ergebnis also so hier:

    %4711
    N1
    N2
    N3
    N4
    N5
    N6
    N7
    N8
    N9
    N10
    N11
    N12
    N13
    N14 G99


    Die Zahl nach dem Prozentzeichen ist immer vierstellig, aber unterschiedlich. Ich hoffe es ist einigermaßen verständlich was ich vorhabe.
    Ich möchte die einzelnen Terme die in fortlaufenden Prozentnummern geordnet sind, speichern und dann wieder ausgeben.

    Ich habe mal angefangen, mir eine Logik zu überlegen, aber irgendwie fehlt mir der richtige Ansatz:



    VB.NET-Quellcode

    1. For Each line As String In File.ReadLines(Dummy)
    2. ' Nur wenn Prozentzeichen da ist
    3. If line.Contains("%") And Not line.Contains("N") And Not zaehler = 1 Then
    4. 'Zeilen speichern
    5. Schreiben = 1
    6. End If
    7. 'Aufhören Zeilen zu speichern, wenn %-Zeichen kommt !
    8. If line.Contains("%") And line.Contains("N") And Not zaehler = 1 Then
    9. 'Nicht mehr speichern
    10. Schreiben = 0
    11. End If
    12. If Schreiben = 1 Then
    13. 'Speichern der Zeilen je nach Variable
    14. End If
    15. zaehler = zaehler + 1
    16. Next


    Über einen Lösungshinweis würde ich mich sehr freuen !

    benji2012 schrieb:

    eine Logik
    So was:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Public Class Form1
    2. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    3. Dim newContent As New List(Of String)
    4. Dim first = True
    5. For Each line As String In IO.File.ReadLines("c:\temp\test.txt")
    6. If (Not String.IsNullOrEmpty(line.Trim)) Then
    7. Dim index = line.IndexOf("%")
    8. If index > 0 And Not first Then
    9. newContent.Add(line.Substring(0, index))
    10. ElseIf index = 0 And Not first Then
    11. ' nix tun
    12. Else
    13. newContent.Add(line)
    14. End If
    15. End If
    16. first = False
    17. Next
    18. End Sub
    19. End Class


    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!
    Leider bekomme ich den Code nicht auf meine Anforderungen angepasst. Ausgangsdatei war diese:

    %4711
    N1
    N2
    N3
    N4%4712
    N5
    N6

    %4712
    N7
    N8
    N9
    N10%4713
    N11

    %4713
    N12
    N13
    N14
    N15 G99


    Ergebnis mit dem Code aus Post#2:

    %4711
    N1
    N2
    N3
    N4
    N5
    N6
    N7
    N8
    N9
    N10
    N11
    N12
    N13
    N14
    N15 G99


    Es sollen aber die unteren Passagen der Textdatei (%) in den ersten Abschnitt implementiert werden.
    Also z.B. %4712 soll komplett an der Stelle N4%4712 stehen. Also so hier :

    %4711
    N1
    N2
    N3
    N7
    N8
    N9
    N12
    N13
    N14
    N15 G99
    N11
    N5
    N6

    benji2012 schrieb:

    in den ersten Abschnitt implementiert werden
    Kannst Du das mal verbal beschreiben?
    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!
    gerne, vlt. sagt ein bild mehr als viele Worte...der blaue Inhalt wird anstelle von N10%4713 eingefügt. Und der gesamt rote Block (mit dem blauen dann) anstelle von
    N4%4712 eingefügt. So ähnlich wie mit Varaiblen rechnen:

    1
    2
    3
    a
    5
    6
    b

    a
    2
    3
    4

    b
    6
    7
    8
    Bilder
    • Unbenannt.jpg

      19,68 kB, 168×397, 101 mal angesehen
    Jou.
    Dann musst Du beim Einlesen die Blöcke getrennt abspeichern, z.B. als List(Of List(Of String)).
    Du liest die Zeilen einzeln ein, und immer wenn eine Leerzeile kommt, speicherst Du den gelesenen Block ab.Dann gehst Du von hinten nach vorn durch, ermittelst im letzten Eintrag die ersetzenden Zeilen und gehst damit in den vorletzten Block, wo Du die zu ersetzende Zeile / den zu ersetzenden Text dadurch ersetzt.
    Den letzten Eintrag löschen und weiter im Text, bis der erste Eintrag ersetzt wurde.
    Feddich. :D
    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!
    Dann gehst Du von hinten nach vorn durch, ermittelst im letzten Eintrag die ersetzenden Zeilen und gehst damit in den vorletzten Block, wo Du die zu ersetzende Zeile / den zu ersetzenden Text dadurch ersetzt.


    Danke Rod für den Lösungsansatz, soweit verstehe ich das und kann das umsetzen. Nur wüßte ich nicht, wie ich von vorn nach hinten durchlese und dann in den vorletzten Block gehe und die Zeile ersetze ?

    benji2012 schrieb:

    und die Zeile ersetze
    Du hast eine Liste 1, in der sind alle zusammengehörigen Zeilen als Listen 2 abgespeichert.
    In Liste 1 gehst Du mit einer For-Schleife über die Indizes rückwärts durch (Step -1), beginnend beim vorletzten Index (= Anzahl - 2) bis zur 0. Dieser vorletzte Index ist der Zielindex, der letzte ist der Quellindex.
    Mit dem Quellindex holst Du Dir die einzufügenden Daten.
    Mit dem Zielindex holst Du Dir die Position, wo die einzufügenden Daten hingehören.
    Dann einfach

    VB.NET-Quellcode

    1. Dim result = Ziel.Replace("%@@@", Quelle)
    und dann weiter mit dem nächsten (kleineren) Index.
    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!
    Hallo Rod,

    danke für die ausführliche Erklärung, aber ich muss mich da irgendwie vorher belesen. Das ist in etwa so, als wenn du mir erklärst, das ich mit einem Hammer und einem Nagel ein Bild in die Wand hauen muss, ich aber nicht weiß wie ein Nagel aussieht. ?( Gibt es Bücher die Strings und deren Verarbeitung gut erklären ?

    benji2012 schrieb:

    erklären
    Fang an mit der MSDN.
    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!