Text einlesen, auswerten und getrennt abspeichern

  • VB.NET

Es gibt 21 Antworten in diesem Thema. Der letzte Beitrag () ist von promsn.

    Text einlesen, auswerten und getrennt abspeichern

    Hallo,

    nach SuFu im Forum und Stunden von lesen poste ich mein Problem hier rein. Das Thema streamreader und textbox ist ja nix neues hier. Ich habe, denke ich, aber einen speziellen Fall.

    Ich habe eine txt-Datei ca. 1.1MB. Ich hab es hinbekommen das diese nun eingelesen wird. Nun ist Datei wie folgt aufgebaut:

    1234
    TEXT
    TEXT
    TEXT


    5678
    TEXT
    TEXT


    usw.
    Als Trenner würde ich gerne zwei Zeilenumbrüche nutzen. So lange diese nicht kommen, ist dies eine Datei.
    In diesem Bsp. wäre 1234.txt so:
    1234
    TEXT
    TEXT

    Die 5678.txt so:
    5678
    TEXT
    TEXT


    Am besten wäre mir noch eine Progressbar damit den Verlauf sieht das auch was passiert.

    Vielen Dank schon mal für die Hilfe.

    VG promsn
    Dazu kannst du die Split-Funktion nutzen.

    Text bei zweifachem Zwilenumbruch splitten und die jeweiligen splitparts in einer anderen Datei speichern.

    Das ganze in einem Backgroundworker abarbeiten lassen, damit sich das Programm beim verarbeiten der Daten nicht aufhängt. Zusätzlich lässt sich die Progressbar mit der Backgroundworker gut ansteuern.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    als was hast du denn deine Datei eingelesen? Als Array? Als Liste? Als Stack?

    und schau doch bitte mal da vorbei. Fang erstmal langsam an und mach dich mit den Grundlagen ertraut

    Als Array

    VB.NET-Quellcode

    1. Dim deinArray() As String
    2. For i = 0 To deinArray.Length -1
    3. If deinArray(i) = "" Then
    4. 'neue Datei
    5. Else
    6. 'schreibe in alte datei
    7. End If
    8. Next

    Als Liste

    VB.NET-Quellcode

    1. Dim deineListe As List(Of String)
    2. For Each element in deineListe.Items
    3. If element = "" Then
    4. 'neue Datei
    5. Else
    6. 'schreibe in alte datei
    7. End If
    8. Next

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

    Siehe Post, hab noch was bearbeitet.

    In etwa so: (hab kein VB zur Hand, stimmt also nicht alles :) und soll dir nur als Starthilfe dienen)
    Beim Backgroundworker muss WorkerReportsProgress auf True gesetzt werden.

    VB.NET-Quellcode

    1. Private Sub BGW_DoWork.....
    2. 'Daten einlesen
    3. Dim Kompletter_Text as String() = IO.ReadAllLines... 'Das hast ja hinbekommen...
    4. Dim Splitt_Text As String() = Kompletter_Text.Split(VBNewLine & VBNewLine)'Hier das Splitten
    5. For i As Integer = 0 to Splitt_Text.Items.Count-1 'Hier jeden Gesplitteten Part durchlaufen
    6. 'Den Part speichern
    7. IO.WriteAllLines(Splitt_Text(i),"C:\" & i & ".txt")
    8. BGW.ReportProgress(100 / Splitt_Text.Items.Count-1 * i) 'Prozentwert übergeben
    9. Next
    10. End Sub
    11. Private Sub BGW_ProgressChanged.....
    12. Progressbar1.Value = e.ProgressPercentage
    13. End Sub
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Guten Morgen,

    ich hab noch ein paar Probleme mit diesem Bereich:

    VB.NET-Quellcode

    1. For i As Integer = 0 to Splitt_Text.Items.Count-1 'Hier jeden Gesplitteten Part durchlaufen
    2. 'Den Part speichern
    3. IO.WriteAllLines(Splitt_Text(i),"C:\" & i & ".txt")


    Ich bekomme zwei Meldungen.
    Fehler 1 "Items" ist kein Member von "System.Array".
    Fehler 2 "WriteAllLines" ist kein Member von "IO".

    Ich hab versucht das selber zu lösen, jedoch hänge ich bei Items ist kein Member von System.Array fest :/
    Wie schon gesgt, das war aus dem Kopf herraus. Da kann immer mal was falsch sein.
    Das sollte dir als Überblick dienen wie es in etwa geht, und nicht als fertige Lösung.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    Guten Morgen punkt :)

    So ähnlich hatte ich es schon mal, jedoch diese Meldung:

    Fehler 1 Der Wert vom Typ "String" kann nicht zu "1-dimensionales Array von String" konvertiert werden.

    VG

    Edit:

    T1g0r schrieb:

    Wie schon gesgt, das war aus dem Kopf herraus. Da kann immer mal was falsch sein.
    Das sollte dir als Überblick dienen wie es in etwa geht, und nicht als fertige Lösung.
    Richtig. Nur habe ich es halt versucht aber nicht hinbekommen...

    Edit by Lupus: Keine Doppelposts!

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

    Nimm UBound(Splitt_Text)
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    UBound liefert dir den höchsten Index des Arrays.
    Also ist For i As integer = 0 to UBound(Splitt_Text) eine Schleife von 0 bis zum höchsten Index.
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    mein fehler: IO.File.WriteAllText nicht IO.File.WriteAllLines

    VB.NET-Quellcode

    1. For i As Integer = 0 to Splitt_Text.Length -1
    2. IO.File.WriteAllText("C:\" & i & ".txt",Splitt_Text(i))
    3. Next

    und wichtig, erst WirteAllText(pfad,content) ... nicht umgedreht ;)

    ... wenn Arrays Zeilenweise in eine Datei schreiben willst nimmst du WriteAllLines.
    Danke für die Hilfe. Jedoch klappt es nicht wie es soll. Es wird mir pro Zeile eine Textdatei erstellt. Bei 12000 hab ich abgebrochen. Es soll jedoch alles in eine txt Datei geschrieben werden bis die nächsten zwei Leerzeilen kommen.

    VG
    Hast du beim Splitten einen Doppelten Zeilenumbruch angegeben?
    Wie sehen denn die Splitt-Teile aus, wenn du einen Haltepunkt setzt? Sind die Splitt-Teile OK oder sind diese auch schon nur einzeilig?
    wintoolz.de
    • wintoolz.KeyLocker - Programm zum sicheren Verwalten von Passwörten
    • wintoolz.CodeGallery - Datenbank für Codebeispiele veschiedener Programmiersprachen
    • wintoolz.Haushaltsbuch - Dient zum Auflisten der Aktivitäten ihrer Bankkonten

    Benutze auch du Ecosia
    auch wenn das sicher nicht die beste Lösung ist ... aber ich würde erstmal anders Splitten:

    Quellcode

    1. 1234
    2. zeile1
    3. zeile2
    4. 2345
    5. zeile1
    6. zeile2

    VB.NET-Quellcode

    1. Dim text As String = "1234 ... usw"
    2. Dim arrayMitDateiInhalten As String() = Split(text, vbcrlf & vbcrlf)
    3. For Each DateiInhalt As String In arrayMitDateiInhalten
    4. DateiZeilen = Split(DateiInhalt, vbcrlf)
    5. DateiName = DateiZeilen(0)
    6. DateiInhalt = ""
    7. For i = 1 To DateiZeilen.Length - 1
    8. DateiInhalt = DateiInhalt & DateiZeilen(i) & VbCrLf
    9. Next
    10. IO.File.WriteAllText("C:\" & DateiName" & ".txt", DateiInhalt)
    11. Next


    so könnte es gehen ... habe es aber nicht probieren können