Problem mit den Schreiben in eine Datei - nicht alle Daten kommen an

  • VB.NET

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

    Problem mit den Schreiben in eine Datei - nicht alle Daten kommen an

    Moin!

    ich habe ein Programm zu erstellen bei dem bestimmte Datenzeilen zu manipulieren sind.

    Die Dateien können bis zu 1 Mio. Zeilen haben, dass als Anmerkung.

    Nun sollen die ersten 28345 Zeilen (=_Section_Begin_Block) aus der Datei A (_InputDXFFile) gelesen werden und in die Datei B (NewFileName) geschrieben werden.

    Hierzu habe ich folgenden Code:

    VB.NET-Quellcode

    1. Dim fs As FileStream = New FileStream(NewFileName, FileMode.Create, FileAccess.Write)
    2. Dim w As StreamWriter = New StreamWriter(fs)
    3. Dim Crlf As String = ""
    4. ' Schreiben des Teils VOR der Blockdefinition
    5. Dim objReader As New System.IO.StreamReader(_InputDXFFile)
    6. Dim sLine As String = ""
    7. Dim Pointer As Long = 0
    8. rtb_Protokoll.Text = ""
    9. For Pointer = 1 To _Section_Begin_Block - 1
    10. sLine = objReader.ReadLine()
    11. w.Write(Crlf & sLine)
    12. Crlf = Environment.NewLine
    13. Next


    Am Ende der Scheife ist Pointer = 28345 und sLine hat auch den Inhalt aus der Datei A.

    Aber in der Zieldatei kommen nur 28228 Zielen an.

    Die zugehörige Zeilennummer muss ich immer mitschleppen um bestimmte Zeilen zu manipulieren.

    Fällt einem von Euch etwas an meinem Code auf oder hat eine Idee woran es liegen kann oder wie es besser geht?

    Gruß Jan
    @jan99 Folgende Sachen:
    • Crlf = Environment.NewLine mach vor die Schleife.
    • Ist gesichert, dass Environment.NewLine als Trennzeichen in der Ursprungs-Datei verwendet wird?
    • Deine Schleife fängt bei 1 an und hört mit - 1 auf. Ist das so gewollt?
    Probier das ganze mal mit sagen wir 100 Zeilen (sofern innerhalb dieser Zahl Zeilen flöten gehen) und kläre das im Notepad (nicht Notepad++) auf.
    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!
    Willst du nur die Zeilenumbrüche in Environment.NewLine umwandeln oder was ist die Mission dahinter?

    @RodFromGermany
    Crlf = Environment.NewLine mach vor die Schleife.

    Hat er absichtlich dadrin stehen, damit er nicht mit einer leeren Zeile beginnt

    Ist gesichert, dass Environment.NewLine als Trennzeichen in der Ursprungs-Datei verwendet wird?

    Für das Code-Beispiel völlig irrelevant, da er es in die neue Datei einfügt und nicht aus der alten ausliest.

    Deine Schleife fängt bei 1 an und hört mit - 1 auf. Ist das so gewollt?

    Tut er nicht... wir wissen nicht welche Zahl er in _Section_Begin_Block vorhält.

    Bist du bei der Sache? :D



    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

    Dieser Beitrag wurde bereits 4 mal editiert, zuletzt von „Yanbel“ ()

    Moin!

    danke erst einmal für die Rückmeldung.

    Im wesentlichen hat Yanbel die Punkte 1-2 beantwortet.

    Das mit dem Wert in xxx hatte ich vielleicht etwas doof beschrieben.

    Nun sollen die ersten 28345 Zeilen (=_Section_Begin_Block) aus der Datei A


    VB.NET-Quellcode

    1. _Section_Begin_Block = 28345


    Das mit den ersten 100 Zeilen...

    VB.NET-Quellcode

    1. For Pointer = 1 To 100 - 1
    2. sLine = objReader.ReadLine()
    3. w.Write(Crlf & sLine)
    4. Crlf = Environment.NewLine
    5. Next


    Datei ist leer.

    Jetzt noch einmal mit 1000... kommen 593 Zeilen an.

    ????

    Jetzt mache ich aber erst einmal Feierabend für heute.

    Würde Ihr das auf demselben Weg lösen meine Aufgabenstellung?

    Gruß Jan
    Auf die schnelle sehe ich nicht warum der Fehler auftritt, aber ich kann ich reproduzieren.

    Nimm den Code, der funktioniert:

    VB.NET-Quellcode

    1. Dim AllText As String = String.Empty
    2. Using sr As New StreamReader(_InputDXFFile)
    3. AllText = sr.ReadLine
    4. For Pointer = 0 To _Section_Begin_Block - 2
    5. AllText &= Environment.NewLine & sr.ReadLine
    6. Next
    7. sr.Close()
    8. End Using
    9. Using sw As New IO.StreamWriter(NewFileName)
    10. sw.WriteLine(AllText)
    11. sw.Close()
    12. End Using


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.
    @jan99 Wenn das so signifikant ist, setz Dir nen bedingten BreakPoint und debugge.
    Debuggen, Fehler finden und beseitigen
    @Yanbel Da hätte ich .WriteLine() genommen.
    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!
    Bei solchen Datenmengen wäre ein StreamWriter.Flush zwischendurch sinnvoll. Solch ein StreamWriter kann nicht ewig viele Daten aufnehmen. Außerdem sollten FileStream und StreamWriter/-Reader auch disposed werden -> Using-Block nutzen.
    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.
    @exc-jdbi hat Recht mit seiner Vermutung. Habs es bis zu der Stelle debuggt, wo der Fehler auftritt, bei unterschiedlich vielen Zeilen die ich verarbeite tritt er an unterschiedlicher Stelle auf. Wenn ich am Ende flushe, schreibt er die neue Datei sauber weg.

    @jan99: Nimm meinen Code, der beinhaltet alles was hier gepostet wurde: Using, Dispose, WriteLine(), etc.

    @RodFromGermany
    @Yanbel Da hätte ich .WriteLine() genommen.

    Verständlich, ich auch... siehe Code-Beispiel :D




    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.

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

    Stream(Reader) bietet die Möglichkeit, Daten häppchenweise zu bewegen statt in irgendeiner Weise einen Komplett-Load zu vollziehen

    VB.NET-Quellcode

    1. Using sr As New StreamReader(_InputDXFFile), sw As New IO.StreamWriter(NewFileName)
    2. For Pointer = 0 To _Section_Begin_Block - 2
    3. dim line = sr.ReadLine
    4. sw.WriteLine(line)
    5. Next
    6. End Using
    Closen, Flushen nicht erforderlich - das ist bereits über den Using-Block abgedeckt.
    @ErfinderDesRades Da der Code aktuell nichts anderes tut, als einen bestimmten Abschnitt der Datei zu nehmen und CarriageReturn und NewLine einheitlich zu NewLine zu machen, kann ich nicht ausschließen, dass NewLine hier entscheidend ist. Und WriteLine() trennt meines Wissens nach mit CarriageReturn. Daher habe ich die Zeilen wie im Ursprungscode getrennt und als ganzes weggeschrieben. Soweit die Intention dahinter. Ansonsten gebe ich dir absolut Recht und dein Code ist ja auch nochmal etwas schlanker als meiner. ;)


    Ein Computer wird das tun, was du programmierst - nicht das, was du willst.