Разделить большую строку

У меня есть длинный текст, который нужно преобразовать в небольшие строки, чтобы я мог включить его в сценарий AutoIt. Если я включаю многострочный текст, он показывает error unterminated string. Итак, я должен был:

"numbercharswillbe10" &_ "othernumbersofcharwillbe10" &_ etc..

Как я могу разделить его с помощью & _ -разделителей?


person Sir Jack    schedule 02.06.2017    source источник


Ответы (1)


Конкатенация строк

Согласно Документация — Справочник по языку — Операторы:

& Объединяет/объединяет две строки.

&= Назначение конкатенации.

Пример:

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

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

ConsoleWrite($g_sText)

Многострочные операторы

Согласно Документация — Справочник по языку — Комментарии (курсив добавлен, так как вызывает упомянутую ошибку «незавершенная строка»):

Хотя допускается только одна инструкция в строке, длинная инструкция может занимать несколько строк, если в конце «ломаной» строки ставится символ подчеркивания «_», которому предшествует пробел. Определение строки нельзя разделить на несколько строк, необходимо использовать конкатенацию.

Пример:

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

ConsoleWrite($g_sText)

Двойные кавычки

Согласно Документация - Часто задаваемые вопросы - Двойные кавычки:

Если вы хотите использовать двойные кавычки внутри строки, вы должны «удвоить их». Таким образом, для каждой цитаты, которую вы хотите, вы должны использовать две. ...

или вместо этого используйте одинарные кавычки...

Примеры доступны из источника.

Значения по умолчанию и ограничения

Согласно Документация — Приложение — Ограничения/значения по умолчанию:

4095 Максимальный размер строки скрипта.

2,147,483,647 Максимальная длина строки.

Согласно Документация — Справочник по языку — Типы данных — Строки:

Все строки AutoIt используют кодировку UTF-16 (фактически и точнее UCS-2).

Согласно Документация — Введение — Поддержка Unicode:

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

  • Отправить и ControlSend — вместо этого используйте функции ControlSetText или буфера обмена.
  • Консольные операции преобразуются в ANSI.
  • Альтернативы

    Альтернативы жесткому кодированию включают ClipGet() и FileRead().

    Текст из буфера обмена

    Пример (сначала выберите и скопируйте текст CTRL + C):

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

    Текст из файла

    Пример (сначала создайте C:\my_long_string.txt):

    #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
    

    Разделить строку

    Альтернативы жестко запрограммированному ручному разбиению строк включают StringSplit(), _StringExplode() (связанные) и StringMid().

    Структурный

    StringSplit() разбивает строку на массив:

    • отдельные символы (на пустом разделителе),
    • слова (через пробел delimiter) or
    • lines (on @CRLF, @LF или @CR разделитель).

    Одинаковая длина

    StringMid() возвращает часть строки. Может использоваться для разделения на части одинаковой длины. Пример (без проверки ошибок, сначала выберите и скопируйте текст CTRL + C):

    #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
    

    Присоединить строку

    Согласно документации:

    _ArrayToString
    Помещает элементы одномерного или двумерного массива в одну строку, разделенную указанными разделителями.

    Пример (добавьте _StringSplitEqual() и сначала выберите и скопируйте текст CTRL + C):

    #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)
    

    Возвращает:

    $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."
    
    person user4157124    schedule 03.06.2017