Das letzte CRFL in einer Textdatei löschen.

  • Halllo Leute,


    ich habe eine anfordung in einer Textdatei soll das letzte CRFL löschet werden . Ich habe es mit einem Array getestet, weiß aber nicht wie ich nach CRFL suchen kann.

    Hat jemand so was änlichen schon geamcht ??

    Meine erste idee war es mit der Funktion StringStripCR es zu machen. bekomme es leider nicht hin.

    Danke für die Hilfe

    Einmal editiert, zuletzt von pennen (15. Februar 2011 um 15:55)

  • Es handels sich um eine CSV Datei.

    z.B.

    5467846;5467846.tif;B_11.01.11_BST_13.36.16_121536;Rechnung;RE005385;2011-01-11;75006

    5467845;5467845.tif;B_11.01.11_BST_13.36.16_121536;Rechnung;RE005386;2011-01-11;75006

    Einmal editiert, zuletzt von pennen (15. Februar 2011 um 15:56)

  • Hi,

    guck dir das hier mal an.

    Ich habe da auch eine Funktion gepostet die recht kurz und übersichtlich ist. Ich denke das sollte dir weiterhelfen.

    Gruß Daniel

  • Hallo pennen,

    ungetestest, sollte aber so funktionieren:

    [autoit]

    #Include <File.au3>

    [/autoit][autoit][/autoit][autoit]

    $sPath = "DeineDatei.CSV"
    $iLine = _FileCountLines($sPath)
    _FileWriteToLine($sPath,$iLine,StringStripWS(FileReadLine($sPath),3),1)

    [/autoit]

    mfg autoBert

  • Danke Leute,


    ich habe beide Versionen getest doch leider keine hat Funktioniert :(.

    Ich habe bei dem letzten Datensatz immer noch einen CRLF stehen. Heul.

  • Hi,
    hab dir mal was gebaut:

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    $sData = FileRead(@ScriptDir & "\Test.txt")
    $aData = StringSplit($sData, @CRLF, 1)
    If $aData[$aData[0]] = "" Then ;Prüfen ob ein CRLF am ende ist bzw. ob der letzte eintrag im Array leer ist, was auf ein CRLF am Ende schließt
    $CRLFCount = 1
    For $x = $aData[0] - 1 To 1 Step -1 ;Nach weiteren CRLF am Ende suchen
    If $aData[$x] = "" Then
    $CRLFCount += 1
    Else
    ExitLoop
    EndIf
    Next
    ConsoleWrite($CRLFCount & @CRLF)
    $sOutput = _ArrayToString($aData, @CRLF, 1, $aData[0] - $CRLFCount)

    [/autoit] [autoit][/autoit] [autoit]

    FileWrite(@ScriptDir & "\Test_.txt", $sOutput)
    EndIf

    [/autoit]

    Vorher: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.
    Nachher: Der Inhalt kann nicht angezeigt werden, da er nicht mehr verfügbar ist.

  • Hier was mit StringRegExpReplace ;).

    [autoit]

    $sTest = FileRead("Test.txt")

    [/autoit][autoit][/autoit][autoit]

    $sResult = StringRegExpReplace($sTest, '(?:\r\n)+?\z', "")

    [/autoit][autoit][/autoit][autoit]

    FileWrite("TestNew.txt", $sResult)

    [/autoit]
  • Vielen Dank!!! Echt super Forum Leute :).

    I ch hoffe ich kann auch bald mein Beitrag dazu leisten :)

  • Die Lösungen sind, vor allem bei großen Dateien, aber unnötig langsam da in allen Fällen in jedem Fall erst die komplette Datei eingelesen wird und dann die komplette Datei nur ohne abschließendes @CRLF neu geschrieben wird.
    Effektiver wäre es da z.B. zu checken ob überhaupt ein abschließendes @CRLF existiert und in dem Fall die Dateigröße nur um 2 Byte zu verringern und somit das @CRLF abzuschneiden.
    Der Rest der Datei bleibt dann völlig unangetastet.

    Beispiel:

    Spoiler anzeigen
    [autoit]

    #include <WinAPI.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $sDatei = "Test.csv"

    [/autoit] [autoit][/autoit] [autoit]

    $iReturn = _FileDeleteLastCRLF($sDatei)
    Switch $iReturn
    Case -1
    MsgBox(0, "Fehler", "Fehler aufgetreten")
    Case 0
    MsgBox(0, "", "Kein abschließendes @CRLF gefunden")
    Case 1
    MsgBox(0, "", "Abschließendes @CRLF gelöscht")
    EndSwitch

    [/autoit] [autoit][/autoit] [autoit]

    ; #FUNCTION# ======================================================================================
    ; Name ..........: _FileDeleteLastCRLF()
    ; Description ...: Delete ending @CRLF in a File if exists
    ; Syntax ........: _FileDeleteLastCRLF($sDateiname)
    ; Parameters ....: $sDateiname - Filepath as a string
    ; Return values .: Success: returns 1 if @CRLF deleted or 0 if no @CRLF exists
    ; Failure: returns -1 and set @error
    ; Author ........: AspirinJunkie
    ; Related .......: WinAPI.au3
    ; =================================================================================================
    Func _FileDeleteLastCRLF($sDateiname)
    Local $hFile = _WinAPI_CreateFile($sDateiname, 2, 6)
    Local $iRet = 0
    If $hFile = 0 Then Return SetError(1, @error, -1)
    Local $tBuffer = DllStructCreate("byte[2]"), $nbytes

    [/autoit] [autoit][/autoit] [autoit]

    _WinAPI_SetFilePointer($hFile, -2, $FILE_END)
    _WinAPI_ReadFile($hFile, DllStructGetPtr($tBuffer), 2, $nbytes)
    If BinaryToString(DllStructGetData($tBuffer, 1)) == @CRLF Then
    _WinAPI_SetFilePointer($hFile, -2, $FILE_END)
    _WinAPI_SetEndOfFile($hFile)
    $iRet = 1
    EndIf
    _WinAPI_CloseHandle($hFile)
    Return $iRet
    EndFunc ;==>_FileDeleteLastCRLF

    [/autoit]