String nach Zeichenzahl splitten

    • Offizieller Beitrag

    Hi,
    es war heute die Frage wie man nach einer bestimmten Anzahl Zeichen splitten kann.
    Diese Lösung paßt in einen Einzeiler. Ich habe aber das nun etwas flexibler gemacht.

    - Splitten von Anfang oder Ende (Standard: von Anfang)
    - Ergebnis LeftToRight (Standard) oder RightToLeft

    _StringSplit_ByCount( )
    [autoit]

    $s = 'Abcde3ghijKlmnop2rstUvwxy1'

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

    ConsoleWrite('von Li - LTR' & @CRLF)
    $ret = _StringSplit_ByCount($s, 10)
    For $i = 0 To UBound($ret) -1
    ConsoleWrite($ret[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

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

    ConsoleWrite('von Li - RTL' & @CRLF)
    $ret = _StringSplit_ByCount($s, 10,0,1)
    For $i = 0 To UBound($ret) -1
    ConsoleWrite($ret[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

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

    ConsoleWrite('von Re - LTR' & @CRLF)
    $ret = _StringSplit_ByCount($s, 10,1)
    For $i = 0 To UBound($ret) -1
    ConsoleWrite($ret[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

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

    ConsoleWrite('von Re - RTL' & @CRLF)
    $ret = _StringSplit_ByCount($s, 10,1,1)
    For $i = 0 To UBound($ret) -1
    ConsoleWrite($ret[$i] & @CRLF)
    Next
    ConsoleWrite(@CRLF)

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

    ;===============================================================================
    ; Function Name: _StringSplit_ByCount($s_String, $i_Count [, $i_FromEnd=0 [, $i_RTL=0]])
    ; Description: Splitten eines Strings nach Anzahl Zeichen
    ; Parameter(s): $s_String der zu splittende String
    ; $i_Count Zeichenzahl nach der zu splitten ist
    ; $i_FromEnd Splitten am Ende beginnen (Standard 0 - vom Anfang)
    ; $i_RTL 1 - String RightToLeft zurückgeben (Standard 0 - LTR)
    ; Return Value(s): Erfolg - Array mit den Splitergebnissen
    ; Fehler - Leerstring
    ; set @error: 1 (String zu kurz)
    ; 2 ($iCount größer Stringlänge)
    ; 3 (RTL fehlgeschlagen)
    ; Author(s): BugFix ([email='bugfix@autoit.de'][/email])
    ; RTL is _StringRevers function
    ;===============================================================================
    Func _StringSplit_ByCount($s_String, $i_Count, $i_FromEnd=0, $i_RTL=0)
    If StringLen($s_String) < 2 Or $i_Count < 1 Then Return SetError(1,0,"")
    If $i_Count > StringLen($s_String) Then Return SetError(2,0,"")
    If $i_FromEnd <> 0 Then $i_FromEnd = 1
    If $i_RTL <> 0 Then $i_RTL = 1
    Local $a_Tmp[Ceiling(StringLen($s_String)/$i_Count)]
    If $i_FromEnd Then
    For $i = 0 To UBound($a_Tmp) -1
    $a_Tmp[$i] = StringRight($s_String, $i_Count)
    $s_String = StringTrimRight($s_String, $i_Count)
    Next
    Else
    $a_Tmp = StringRegExp($s_String, '.{1,' & $i_Count & '}', 3)
    EndIf
    If $i_RTL Then
    For $i = 0 To UBound($a_Tmp) -1
    Local $i_len = StringLen($a_Tmp[$i])
    Local $t_chars = DllStructCreate("char[" & $i_len + 1 & "]")
    DllStructSetData($t_chars, 1, $a_Tmp[$i])
    Local $a_rev = DllCall("msvcrt.dll", "ptr:cdecl", "_strrev", "ptr", DllStructGetPtr($t_chars))
    If @error Or $a_rev[0] = 0 Then Return SetError(3,0,"")
    $a_Tmp[$i] = DllStructGetData($t_chars, 1)
    Next
    EndIf
    Return $a_Tmp
    EndFunc ;==>_StringSplit_ByCount

    [/autoit]