Textfiles per VB bearbeiten/kürzen

  • VB.NET

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

    Textfiles per VB bearbeiten/kürzen

    Hallo,

    ich hoffe ihr könnt mir helfen ich bin leider nicht wirklich erfahren was VB angeht, habe aber die Aufgabe Textfiles einzulesen und dann einen mittleren Teil raus zu löschen. Die beiden übrig gebliebenen Teile sollen dann zusammen gefügt werden und anschließen noch als PDF gedruckt werden. Ich verstehe allerdings nicht genau wie und bei den Sachen, die ich bisher in diesem Internet :D gefunden habe, habe ich nur Bahnhof verstanden ;(.

    Also nochmal Konkret:

    im Textfile:
    Sind oben ca 10- 15 Zeilen beschrieben

    dann kommen ca 1000-1500 Zeile, die mich nicht interessieren und weg sollen

    und am Ende nochmal ca 200 Zeilen, die ich wieder brauche.

    Die Zeilenangeben sind immer unterschiedlich. Allerdings ist der Text ab dem ich die Einträge löschen möchte immer der selbe.

    Ich hoffe man versteht das und mir kann geholfen werden. ?(


    Vielen vielen Dank schonmal :)


    Beste Grüße
    @BlackAltaria Willkommen im Forum. :thumbup:
    Sicherlich kann man das automatisieren, wenn Start und Ende des zu löschenden Textes zweifelsfrei erkannt werden können.
    Ansonsten:
    Zieh eine RichTextBox auf Deine Form.
    Zieh einen Button => "Datei öffnen" auf Deine Form.
    Starte einen OpenFile Dialog in der Button_Click-Routine, weise der RichTextBox die Datei zum Lesen zu.
    Editiere das von Hand,
    ggf. speichern / speichern unter (Button "Speichern"),
    Drucken (gugst Du hier) (Button "Drucken"),
    und 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!
    Hmm also eigentlich hatte ich schon vor dass man das vielleicht automatisiert hin bekommt. Zum einen sind das einfach viele files (täglich ca 100 Stück) und außerdem sollen mit dem Tool mehrere Leute arbeiten denen ich nicht zumuten möchte jedes file einzeln einzulesen und händisch zu bearbeiten.
    Gibt es da eine Lösung?! Das würde mir helfen.

    Danke

    BlackAltaria schrieb:

    Gibt es da eine Lösung?
    Klar, allerdings musst Du die zunächst allein bauen.
    Du musst definierfen, wie die erste zu löschende Zeile aussieht und
    Du musst definieren, wie die letzte zu löschende Zeile aussieht.
    Du liest die Datei in eine List(Of String) ein und machst eine Schleife über alle Zeilen.
    Gehört die aktuelle Zeile zur Klasse der zu löschenden Zeilen, löschst Du sie.
    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!
    sooooo, :D
    Ich habe es jetzt mal einigermaßen so hin bekommen wie ich mir das vorstelle ist zwar ein wenig von hinten durch die Brust ins Auge, ABER wichtig ist dass es funktioniert
    Jetzt fehlen noch zwei Kleinigkeiten:

    1. wäre es toll, wenn ich einen ganzen Ordner einlesen könnte und dann jedes txt file nach dem nächsten bearbeitet wird.
    2. am Ende soll das ganze noch automatisch als PDF gedruckt werden. Das PDF soll im gleichen Ordner liegen wie das .txt file und auch genauso heißen.




    VB.NET-Quellcode

    1. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    2. Dim DateiPfad As String
    3. DateiPfad = InputBox("Bitte Dateipfad einfügen.", "txt-Dateipfad")
    4. Dim name = DateiPfad '& ".txt"
    5. Dim name2 = DateiPfad & ".tmp"
    6. Dim i As Integer = 1
    7. Dim h As Integer = 0
    8. For Each line In IO.File.ReadLines(name)
    9. If line = "DIE 1. Gesuchte Zeile" Then
    10. h = h + 1
    11. End If
    12. Next
    13. If h = 1 Then
    14. For Each line In IO.File.ReadLines(name)
    15. IO.File.AppendAllLines(name2, New String() {line})
    16. Next
    17. End If
    18. If h > 1 Then
    19. For Each line In IO.File.ReadLines(name)
    20. If line = "2. Gesuchte Zeile" Then i hochzählen bei Treffer
    21. i = i + 1
    22. End If
    23. If i = 1 Or i = 3 Then
    24. IO.File.AppendAllLines(name2, New String() {line})
    25. ElseIf i = 2 Then
    26. line &= ""
    27. End If
    28. Next
    29. End If
    30. IO.File.Delete(name)
    31. IO.File.Move(name2, name)
    32. End Sub



    Danke schonmal :)
    Ich habe da einen anderen Ansatz, der ist, denke ich, etwas performanter.

    VB.NET-Quellcode

    1. Private Sub CutTextFromTextFile(ByVal txtFile As String, ByVal targetFile As String, ByVal fromLine As String, ByVal toLine As String)
    2. Dim newList As New List(Of String)
    3. Dim addLine As Boolean = True
    4. For Each line In IO.File.ReadAllLines(txtFile) ' .ToList (siehe nächstes posting)
    5. If line.StartsWith(fromLine) And addLine Then
    6. addLine = False
    7. ElseIf line.StartsWith(toLine) And Not addLine Then
    8. addLine = True
    9. End If
    10. If addLine Then
    11. newList.Add(line)
    12. End If
    13. Next
    14. IO.File.WriteAllLines(targetFile, newList)
    15. End Sub

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

    Pasta schrieb:

    VB.NET-Quellcode

    1. For Each line In IO.File.ReadAllLines(txtFile).ToList
    ist ohne .ToList performanter.
    @BlackAltaria Wenn die Dateien gemütlich angelegt werden ist es ggf. sinnvoll, das Erscheinen einr neuen Datei mit dem FilesystemWatcher abzufangen.
    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!
    Soll Startsequenz und Endsequenz mit in die neue Datei übernommen werden?
    Oder nur die Startsequenz?
    Oder nur die Endsequenz?

    Ich optimiere mal den obigen Ansatz:

    VB.NET-Quellcode

    1. Private Sub CutTextFromTextFile(ByVal txtFile As String, ByVal targetFile As String, ByVal fromLine As String, ByVal toLine As String)
    2. Dim newList As New List(Of String)
    3. Dim addLine As Boolean = False
    4. For Each line In IO.File.ReadAllLines(txtFile)
    5. addLine = line.StartsWith(fromLine) OrElse addLine
    6. If addLine Then newList.Add(line)
    7. addLine=line.StartsWith(toLine) OrElse addLine
    8. Next
    9. IO.File.WriteAllLines(targetFile, newList)
    10. End Sub
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    BlackAltaria beantworte doch bitte mal folgende Fragen:

    VB.NET-Quellcode

    1. Text der stehen bleiben soll:
    2. bla, bla, bla, bla, bla, bla,
    3. bla, bla, bla, bla, bla, bla,
    4. bla, bla, bla, bla, bla, bla ... ' Ist das Ende des zu erhaltenen Textes bekannt ?
    5. Text der weg soll: ' ...; oder der Anfang des zu löschenden Textes ?
    6. bla, bla, bla, bla, bla, bla,
    7. bla, bla, bla, bla, bla, bla,
    8. bla, bla, bla, bla, bla, bla, ... ' Ist das Ende des zu löschenden Textes bekannt ?
    9. Rest Text der stehen bleiben soll: ' ...; oder der Anfang des zu erhaltenen Textes ?
    10. bla, bla, bla, bla, bla, bla,
    11. bla, bla, bla, bla, bla, bla, ...
    12. bla, bla, bla, bla, bla, bla
    Hui, da kam ja jetzt noch was zusammen, danke schon mal :) ich werde mir mal die Vorschläge ansehen.


    @Pasta, tatsächlich ist es realtiv egal :D ... bisher ist es so, dass der Anfang des zu löschenden Textes bekannt ist und der Anfang des zu erhaltenden Textes, ist vermutlich auch die eleganteste Lösung für meinen Fall.
    Alternativ könnte man wenn man bei Generischen Listen bleibt mit FindIndex und einer Rekrusiven Schleife arbeiten.
    Spoiler anzeigen

    C#-Quellcode

    1. List<string> fileContent = File.ReadAllLines(fi.FullName).ToList();
    2. int iStart = fileContent.FindIndex(x => x.StartsWith(strStart));
    3. int iEnde = fileContent.FindIndex(x => x.StartsWith(strEnde));
    4. for (int i = (iEnde-1); i > iStart; i--)
    5. fileContent.RemoveAt(i);


    *Edit*
    Oder so...

    C#-Quellcode

    1. List<string> fileContent = File.ReadAllLines(fi.FullName).ToList();
    2. int iStart = fileContent.FindIndex(x => x.StartsWith(strStart));
    3. int iEnde = fileContent.FindIndex(x => x.StartsWith(strEnde));
    4. fileContent.RemoveRange(iStart, iEnde);

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Fakiz“ ()

    bis auf das Drucken habe ich alles hin bekommen :thumbsup: . Sicherlich ist hier und da noch Optimierungsbedarf, aber Priorität hat für mich jetzt erst mal, dass alles funktioniert. ^^
    So wie ich das verstanden habe gibt es nicht direkt die Möglichkeit die files in PDFs umzuwandeln, sondern man muss vom verwendeten PDF Programm individuell die Dateien drucken?! Wir verwenden Adobe gibt es hier die Möglichkeit das im Querformat zu drucken?!
    Was sind denn die Befehle, die ich für sowas brauche?! Stehe da ein wenig auf dem Schlauch ?( :huh:

    BlackAltaria schrieb:

    die files in PDFs umzuwandeln
    Das gibt es ganz gewiss.
    Meist nimmt man da den Standard-PDF-Drucker und druckt das Dokument, aber das willst Du wohl nicht.
    Such mal ganz gezielt nach c sharp pdf erstellen bzw. VB.NET pdf erstellen.
    Da landest Du z.B. hier:
    stackoverflow.com/questions/11…-print-a-pdf-with-c-sharp
    dotnet-snippets.de/snippet/pdf-dateien-selbst-erstellen/1364
    usw.
    Falls Du nun sagen solltest, dass Du C# nicht kannst, wirst Du die Antwort bekommen: Zählt nicht, nutze einen Übersetzer, z.B. diesen hier.
    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!