Datei auslesen und Inhalt nachbearbeiten, durch suchen und Spalten Tauschen

  • VB.NET

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

    Datei auslesen und Inhalt nachbearbeiten, durch suchen und Spalten Tauschen

    Hallo VB Gemeinde,

    ich bin hier neu und stehe gerade vor einem Problem, bei dem ich nicht richtig weis, wie ich die Lösung angehen soll.

    Folgendes Szenario:

    - Ich habe eine Datei mit Fester Zeilenlänge von ANSI 150 danach kommt ein Zeilenumbruch, danach kommt wieder ein String mit 150 Zeichen.

    Ein String sieht z.B. so aus:
    2012010592600170109 78050000 00.00 L 05.50000000.0000.0000000.00

    jetzt soll folgendes passieren, der String soll ausgelesen werden und dort wo das "L" steht sollen die Werte 00.00 davor und 05.50 dahinter vertauscht werden und danach das L gelöscht werden und weiter zum nächsten String gegangen werden und geschaut werden
    ob ein L an der Stelle steht.

    Wie gesagt die Positionen der Zeichen sind immer gleich.

    ich habe es schon mit dem auslesen der Zeile hinbekommen, allerdings bekomme ich das mit dem Zeichenauslesen nicht hin: so sieht mein Code derzeit aus um mir die Zeile anzeigen zu lassen:

    VB.NET-Quellcode

    1. Dim fs As New FileStream("C:\BRZ32\ExImport\winworker\brz1.dat", FileMode.Open) "Quellpfad
    2. Dim sr As New StreamReader(fs)
    3. Dim zeile As String
    4. Do Until sr.Peek() = -1
    5. zeile = sr.ReadLine()
    6. MessageBox.Show(zeile) "Textbox
    7. Loop
    8. sr.Close()

    Kann mir hier jemand helfen? ?(

    Danke schonmal im Voraus!


    Edit by Manschula: Thema aus dem Sourcecode verschoben; VB-Tag eingefügt

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

    Du hast gesagt das die beiden Zeilenteile immer 150 Zeichen lang sind, oder?

    Dann splitte die beiden doch einfach mit String.Split(150) (sollte so ähnlich aussehen, müsstest du mal nach schaun).

    Wegen dem L, du könntest natürlich theoretisch auch die Position von L entwickeln von dieser eins abziehen, und bis zum nächsten Leerzeichen(rückwärts natürlich) alle Zeichen einlesen, so hättest du die 00.00 jetzt müsstest du das ganze nochmals mit der L position +1 machen und dann wieder bis zum nächsten Leerzeichen(jetzt vorwärts) einlesen so hättest du die 05.50, falls du an der Stelle kein Leerzeichen hast, musst du vllt. über eine Fixe länge gehen, falls diese Zahl immer 4 Stellen + Punkt hat.
    Den Rest kannst du dir ja selbst überlegen.

    Ich denke das ist nicht die schönste Lösung aber das was mir grade spontant einfällt. Wenn jemand was besseres hat, soll er es bitte einfach Posten.

    lg.
    lg.

    LucaWelker
    Teile den String bei " L ", splitte die beiden Teilstrings mit " " und setze Dir Deinen Zielstring neu zusammen.
    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 Zusammen,
    erstmal danke für die Schnellen Infos - ja genau es sind immer 150 Zeichen und die leer Zeichen habe ich auch.

    ich testa mal die Ratschläge von euch heute noch und poste dann das ergebnis wie es aussieht.

    Danke! :D
    Wenn vorn oder hinten Leerzeichen und Tabulatoren stehen, kannst Du sie mit String.Trim() entfernen.
    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!
    Habe es hinbekommen, das er mir die einzelnen Strings ausliest jetzt muss ich nur noch den neuen String zusammenbauen
    diesen Code habe ich:

    ich habe mir das ganze jetzt noch in eine seperate Datei schreiben lassen

    VB.NET-Quellcode

    1. Dim fs As New FileStream("C:\BRZ32\ExImport\winworker\brz1.dat", FileMode.Open)
    2. Dim sr As New StreamReader(fs)
    3. Dim WriteString As String
    4. WriteString = sr.ReadToEnd()
    5. REM WriteString.Split("L")
    6. Dim TeilA As String = WriteString.Substring(95, 5)
    7. Dim TeilB As String = WriteString.Substring(108, 5)
    8. MessageBox.Show(TeilA)
    9. MessageBox.Show(TeilB)
    10. Dim fw As StreamWriter = File.CreateText("C:\BRZ32\ExImport\winworker\brz2.dat")
    11. fw.WriteLine(WriteString)
    12. fw.Close()


    Hallo Nochmal, habe noch was geändert, aber irgendwie begrenzt er es mir nicht nur auf die Teilstrings sondern änder alles, wo dieser String vorkommt:

    VB.NET-Quellcode

    1. Private Sub Button12_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button12.Click
    2. Dim fs As New FileStream("C:\BRZ32\ExImport\winworker\brz1.dat", FileMode.Open)
    3. Dim sr As New StreamReader(fs)
    4. Dim WriteString As String
    5. Dim NewWritestring As String
    6. WriteString = sr.ReadToEnd()
    7. WriteString.Split("L")
    8. Dim TeilA As String = WriteString.Substring(95, 5)
    9. Dim TeilB As String = WriteString.Substring(108, 5)
    10. MessageBox.Show(TeilA)
    11. MessageBox.Show(TeilB)
    12. NewWritestring = WriteString.Insert(95, TeilB)
    13. NewWritestring = WriteString.Insert(108, TeilA)
    14. Dim fw As StreamWriter = File.CreateText("C:\BRZ32\ExImport\winworker\brz2.dat")
    15. fw.WriteLine(NewWritestring)
    16. fw.Close()
    17. End Sub


    Edit:
    Mittlerweile habe ich noch ein wenig nachgearbeitet, es lässt sich nur mein Teilstring nicht wieder zusammensetzen irgendwas mache ich falsch.
    Ich krieg das mit dem Tauschen der Werte nich hin TeilA und TeilB sollen getauscht werden.

    VB.NET-Quellcode

    1. Dim sFile_Path As String = "C:\BRZ32\ExImport\winworker\brz1.dat"
    2. Dim lineList() As String = IO.File.ReadAllLines(sFile_Path, System.Text.Encoding.Default)
    3. Dim fw As StreamWriter = File.CreateText("C:\BRZ32\ExImport\winworker\brz2.dat")
    4. Dim strArr() As String
    5. Dim count As Integer
    6. Dim str As String
    7. Dim NewWritestring As String
    8. For i = 0 To lineList.Length - 1
    9. Dim line As String = lineList(i).ToString
    10. strArr = lineList(i).Split("150")
    11. For count = 0 To strArr.Length - 1
    12. Dim TeilA As String = lineList(i).Substring(95, 5)
    13. Dim TeilB As String = lineList(i).Substring(108, 5)
    14. REM MessageBox.Show(TeilA)
    15. REM MessageBox.Show(TeilB)
    16. fw.WriteLine(Join(strArr))
    17. Next
    18. ListBox1.Items.Add(line)
    19. Next
    20. fw.Close()



    Edit by Dodo:
    Bitte
    nutze nächstes Mal die Editier Frunktion. Die Farbe rot ist den Mods
    und Admins vorbehalten und nutze für VB-Code die VB-Tags.

    -> Beiträge zusammengefügt, VB-Tag eingefügt

    Edit2:
    -> Beitrag zusammengefügt

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „Dodo“ ()

    Probier es mal so:

    VB.NET-Quellcode

    1. Dim Part1() As String = pp1.Split(...)
    2. Dim Part2() As String = pp2.Split(...)
    3. Dim Result As String = ""
    4. For i As Integer = 0 To Part1.Length - 2
    5. Result &= Part1(i)
    6. Next
    7. Result &= Part2(0)
    8. Result &= Part1(Part1.Length - 1)
    9. For i As Integer = 1 To Part2.Length - 1
    10. Result &= Part2(i)
    11. Next
    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!

    RodFromGermany schrieb:

    Teile den String bei " L ", splitte die beiden Teilstrings mit " " und setze Dir Deinen Zielstring neu zusammen.

    Das war mein Ausgangspunkt.
    Z.B: so:

    VB.NET-Quellcode

    1. Dim xxx As String = "2012010592600170109 78050000 00.00 L 05.50000000.0000.0000000.00"
    2. Dim index As Integer = xxx.IndexOf(" L ")
    3. Dim pp1 As String = xxx.Substring(0, index)
    4. Dim pp2 As String = xxx.Substring(index + 3)
    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!
    Hi, sieht gut aus, er setzt mir den String hinten zusammen, jetzt probiere ich noch ein Wenig wegen den Leer-Zeichen in dem String.

    Aber schonmal vielen vielen Dank - :P

    ICh habe mal noch ein Wenig getestet, leider geht es nicht.
    mir wird der String immer gekürzt und die neu eingefügte Part2 immer hinten angefügt - kann ich den auch weiter vorn einfügen?

    Das mit den Leerstellen wollte ich über eine Feste länge des lese-strings lösen, geht aber irgendwei nicht.
    Das Vertauschen geht tadellose nochmal danke.

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

    Hallo Liebe VB Gemeinde ich habe folgendes jetzt umgesetzt und so geht es mir folgender Code:

    VB.NET-Quellcode

    1. Result = xxx.Substring(0, 31) & xxx.Substring(38, 6) & xxx.Substring(36, 3) & xxx.Substring(31, 5) & xxx.Substring(44, 22)


    Ist zwar nicht schön aber funktional.

    Danke nochmal an alle!