Split large string

String concatenation

As per Documentation – Language Reference – Operators:

& Concatenates/joins two strings.

&= Concatenation assignment.

Example:

Global $g_sText = "Long " & "string " & "here." & @CRLF

$g_sText &= "More text." & @CRLF

ConsoleWrite($g_sText)

Multi line statements

As per Documentation – Language Reference – Comments (emphasis added, as it causes mentioned “unterminated string” error):

Although only one statement per line is allowed, a long statement can span multiple lines if an underscore “_” preceded by a blank is placed at the end of a “broken” line. String definition cannot be split in several lines, concatenation need to be used.

Example:

Global Const $g_sText = "Long " & _
                        "string " & _
                        "here." & _
                        @CRLF & _
                        "More text." & _
                        @CRLF

ConsoleWrite($g_sText)

Double-quotes

As per Documentation – FAQ – Double quotes:

If you want to use double-quotes inside a string then you must “double them up”. So for every one quote you want you should use two. …

or use single quotes instead …

Examples available from source.

Defaults and limits

As per Documentation – Appendix – Limits/defaults:

4095 Maximum size for a line of script.

2,147,483,647 Maximum string length.

As per Documentation – Language Reference – Datatypes – Strings:

All AutoIt strings use UTF-16 (in fact and more precisely UCS-2) encoding.

As per Documentation – Intro – Unicode Support:

There are a few parts of AutoIt that don’t yet have full Unicode support. These are:

  • Send and ControlSend – Instead, Use ControlSetText or the Clipboard functions.
  • Console operations are converted to ANSI.
  • Alternatives

    Alternatives to hard coding include ClipGet() and FileRead().

    Text from clipboard

    Example (select and copy text CTRL + C first):

    Global Const $g_sText = ClipGet()
    
    ConsoleWrite($g_sText & @CRLF)
    

    Text from file

    Example (create C:\my_long_string.txt first):

    #include <FileConstants.au3>
    
    Global Const $g_sFile="C:\my_long_string.txt"
    Global Const $g_sText = _TextFromFile($g_sFile)
    
    ConsoleWrite($g_sText & @CRLF)
    
    Func _TextFromFile(Const $sFile)
        Local       $hFile = FileOpen($sFile, $FO_READ + $FO_UTF8_NOBOM)
        Local Const $sData = FileRead($hFile)
    
        FileClose($hFile)
        Return $sData
    EndFunc
    

    Split string

    Alternatives to hard coded manual string splitting include StringSplit(), _StringExplode() (related) and StringMid().

    Structural

    StringSplit() splits a string into array of:

    • individual characters (on empty delimiter),
    • words (on space delimiter) or
    • lines (on @CRLF, @LF or @CR delimiter).

    Equal length

    StringMid() returns part of a string. Can be used to split into parts of equal length. Example (no error checking, select and copy text CTRL + C first):

    #include <Array.au3>
    
    Global Const $g_iSize  = 10
    Global Const $g_sText  = ClipGet()
    Global Const $g_aArray = _StringSplitEqual($g_sText, $g_iSize)
    
    _ArrayDisplay($g_aArray)
    
    Func _StringSplitEqual(Const $sText, Const $iSize = 1)
        Local Const $iLength = StringLen($sText)
        Local Const $iParts  = Ceiling($iLength / $iSize)
        Local Const $iRest   = -1; $iLength - ($iSize * Floor($iLength / $iSize))
        Local       $iStart  = 0
        Local       $iCount  = 0
        Local       $aArray[$iParts]
    
        For $i1 = 0 To $iParts - 1
    
            $iStart      = ($i1 * $iSize) + 1
            $iCount      = ($i1 < $iParts - 1) ? $iSize : ($iRest ? $iRest : $iSize)
            $aArray[$i1] = StringMid($sText, $iStart, $iCount)
    
        Next
    
        Return $aArray
    EndFunc
    

    Join string

    As per documentation:

    _ArrayToString
    Places the elements of a 1D or 2D array into a single string, separated by the specified delimiters

    Example (add _StringSplitEqual() and select and copy text CTRL + C first):

    #include <Array.au3>
    
    Global Const $g_iSize      = 10
    Global Const $g_sStart="$sText = ""
    Global Const $g_sEnd       = '"' & @CRLF
    Global Const $g_sDelimiter="" _" & @CRLF & '       & "'
    Global Const $g_sText      = StringReplace(ClipGet(), @CRLF, '')
    Global Const $g_aArray     = _StringSplitEqual($g_sText, $g_iSize)
    Global       $g_sResult    = _ArrayToString($g_aArray, $g_sDelimiter)
    
    $g_sResult = $g_sStart & $g_sResult & $g_sEnd
    ConsoleWrite($g_sResult)
    

    Returns:

    $sText = "AutoIt v3 " _
           & "is a freew" _
           & "are BASIC-" _
           & "like scrip" _
           & "ting langu" _
           & "age design" _
           & "ed for aut" _
           & "omating th" _
           & "e Windows " _
           & "GUI and ge" _
           & "neral scri" _
           & "pting."
    

    Leave a Comment