String nach 30 Zeichen splitten?

  • Titel sagt eigentlich schon alles.

    [autoit]

    local $string = "Hallo Autoit.de, das ist ein Beispielstring der aufgeteilt gehört, aber erst nach z.B: 30 Zeichen, hier wird er leider nach allen 9 geteilt.", $result

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

    $aNumber = StringRegExp($string, "\w{9}", 3)

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

    For $i = 0 To UBound($aNumber) - 1
    $result &= $aNumber[$i] & "-"
    Next

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

    $result = StringTrimRight($result, 1)
    MsgBox(0, "", $result)

    [/autoit]
  • Nächtliche, Koffeingetriebene Lösung :)

    [autoit]

    #include <Array.au3>

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

    local $string = "Hallo Autoit.de, das ist ein Beispielstring der aufgeteilt gehört, aber erst nach z.B: 30 Zeichen, hier wird er leider nach allen 9 geteilt.", $result

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

    $result = StringTrimRight(StringRegExpReplace($string, ".{1,30}", "\0-"),1)

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

    ConsoleWrite("-> " & $result & @LF)

    [/autoit]
  • Du hast es doch schon fast richtig gehabt.
    Änder lediglich dein RegEx-Pattern in

    Code
    .{30}

    Intuitiver kann eventuell die Variante mit StringMid sein:

    Variante mit StringMid
    [autoit]

    Global $string = "Hallo Autoit.de, das ist ein Beispielstring der aufgeteilt gehört, aber erst nach z.B: 30 Zeichen, hier wird er leider nach allen 9 geteilt.", $result
    Global $d_Chars = 30

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

    For $i = 1 To StringLen($string) Step $d_Chars
    $result &= StringMid($string,$i, $d_Chars) & "-"
    Next

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

    $result = StringTrimRight($result, 1)
    MsgBox(0, "", $result)

    [/autoit]
  • Hi,
    wem RegExen zu schwer oder zu aufwendig ist, den bedienen auch die einfachsten Stringfunktionen :rolleyes:

    [autoit]

    $result=""
    for $i=1 to stringlen($string) step 30
    $result&=stringmid($string,$i,30)&"-"
    next
    ConsoleWrite("-> " & $result & @LF)

    [/autoit]

    //EDIT so gehts, wenn man vor dem Abschicken des Posts noch nen Kaffee holen geht :D

    //EDIT2 unlustig :thumbdown:

    ciao
    Andy


    "Schlechtes Benehmen halten die Leute doch nur deswegen für eine Art Vorrecht, weil keiner ihnen aufs Maul haut." Klaus Kinski
    "Hint: Write comments after each line. So you can (better) see what your program does and what it not does. And we can see what you're thinking what your program does and we can point to the missunderstandings." A-Jay

    Wie man Fragen richtig stellt... Tutorial: Wie man Script-Fehler findet und beseitigt...X-Y-Problem

    Einmal editiert, zuletzt von Andy (27. August 2014 um 08:27)

  • Danke, funktioniert. Geht das aus noch mehr ausgebaut, z.B: dass er nicht innerhalb Wörter trennt, sondern erkennt, "ah das ist ein Wort, ich hör lieber bei dem Leerzeichen davor auf?

    • Offizieller Beitrag

    Ich habe das jetzt mal als Funktion (Array als Rückgabe) geschrieben:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>
    Local $string = "Hallo Autoit.de, das ist ein Beispielstring der aufgeteilt gehört, aber erst nach z.B: 30 Zeichen, hier wird er leider nach allen 9 geteilt."
    Local $aResult = _StringSplitAtPos($string, 24, 1)
    _ArrayDisplay($aResult)

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

    Func _StringSplitAtPos($sText, $iPos, $iFlag = 1)
    Local $sSeparatorChar = Opt('GUIDataSeparatorChar')
    If $iPos >= StringLen($sText) Then Return SetError(0, 0, StringSplit($sText, $sSeparatorChar, $iFlag))
    Local $sReturn, $iFound, $iSplit
    Do
    $iFound = 0
    Do
    $iSplit = $iFound
    $iFound = StringInStr($sText, ' ', 2, 1, $iFound + 1)
    Until $iFound > $iPos Or $iFound = 0
    If $iSplit = 0 Then $iSplit = $iPos
    $sReturn &= StringLeft($sText, $iSplit) & $sSeparatorChar
    $sText = StringMid($sText, $iSplit + 1)
    Until StringLen($sText) <= $iPos
    Return SetError(0, 0, StringSplit($sReturn & $sText, $sSeparatorChar, $iFlag))
    EndFunc ;==>_StringSplitAtPos

    [/autoit]

    Edit: Kleinen Fehler beseitigt!
    Edit2: Noch einen Fehler beseitigt!

    • Offizieller Beitrag

    Einfach mit Word-Boundary splitten.

    [autoit]

    $s = "hallo das ist ein test. hier geht es noch weiter und das ist noch lange nicht alles."

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

    $a = StringRegExp($s, '(\b.{1,30}\b|.)', 3)
    For $x In $a
    ConsoleWrite($x & @LF)
    Next

    [/autoit]

    Edit: Um abschließende Satzzeichen zu erkennen (die gelten nicht als zum Wort gehörend, muss "oder jedes Zeichen einmal ("|.") mit abgefragt werden.

  • Also die Word-Boundary Lösung is ja mal ziemlich geil :):thumbup:


    Hier noch ne String-Funktion-Lösung:

    [autoit]

    #include <array.au3>
    Local $sString = "Hallo Autoit.de, das ist ein Beispielstring der aufgeteilt gehört, aber erst nach z.B: 30 Zeichen, hier wird er leider nach allen 9 geteilt."
    Local $sResult, $iChars = 30

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

    $aSplit = StringSplit($sString, " ", 1)
    For $i = 1 To UBound($aSplit) - 1
    If (StringLen(StringTrimLeft($sResult, StringInStr($sResult, @CRLF, 0, -1) + 1)) + StringLen($aSplit[$i])) >= $iChars Then $sResult &= @CRLF
    $sResult &= $aSplit[$i] & " "
    Next
    ConsoleWrite($sResult)

    [/autoit]