string - Dividir cadena grande
text autoit (1)
Tengo un texto largo que debe convertirse en cadenas pequeñas para poder incluirlo en un script AutoIt.
Si
error unterminated string
texto de varias líneas, muestra una
error unterminated string
.
Entonces debería tener:
"numbercharswillbe10" &_ "othernumbersofcharwillbe10" &_ etc..
¿Cómo puedo dividirlo con
& _
-delimitadores?
Concatenación de cadenas
Según la documentación - Referencia del lenguaje - Operadores :
&
Concatenates / une dos cadenas.
&=
Asignación de concatenación.
Ejemplo:
Global $g_sText = "Long " & "string " & "here." & @CRLF
$g_sText &= "More text." & @CRLF
ConsoleWrite($g_sText)
Declaraciones de varias líneas
Según la documentación - Referencia del lenguaje - Comentarios (énfasis agregado, ya que causa el error mencionado de "cadena no terminada"):
Aunque solo se permite una instrucción por línea, una instrucción larga puede abarcar varias líneas si se coloca un guión bajo "
_
" precedido por un espacio en blanco al final de una línea "discontinua". La definición de cadena no se puede dividir en varias líneas, se debe utilizar la concatenación.
Ejemplo:
Global Const $g_sText = "Long " & _
"string " & _
"here." & _
@CRLF & _
"More text." & _
@CRLF
ConsoleWrite($g_sText)
Doble comillas
Según la documentación - Preguntas frecuentes - Comillas dobles :
Si desea utilizar comillas dobles dentro de una cadena, debe "duplicarlas". Entonces, por cada cotización que desee, debe usar dos. ...
o use comillas simples en su lugar ...
Ejemplos disponibles de la fuente.
Valores predeterminados y límites
Según la documentación - Apéndice - Límites / valores predeterminados :
4095
Tamaño máximo para una línea de script.
2,147,483,647
Longitud máxima de cuerda.
Según la documentación - Referencia del lenguaje - Tipos de datos - Cadenas :
Todas las cadenas AutoIt usan codificación UTF-16 (de hecho y más precisamente UCS-2).
Según la documentación - Introducción - Soporte Unicode :
Hay algunas partes de AutoIt que aún no tienen soporte completo de Unicode. Estos son:
Enviar y ControlSend: en su lugar, use ControlSetText o las funciones del Portapapeles. Las operaciones de la consola se convierten a ANSI.
Alternativas
Las alternativas a la
codificación dura
incluyen
ClipGet()
y
FileRead()
.
Texto del portapapeles
Ejemplo (seleccione y copie el texto CTRL + C primero):
Global Const $g_sText = ClipGet()
ConsoleWrite($g_sText & @CRLF)
Texto del archivo
Ejemplo (cree
C:/my_long_string.txt
primero):
#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
Cadena dividida
Las alternativas a la división manual de cadenas codificadas incluyen
StringSplit()
,
_StringExplode()
(
related
) y
StringMid()
.
Estructural
StringSplit()
divide una cadena en una matriz de:
- caracteres individuales (en delimitador vacío),
-
palabras (en el espacio
delimitador) o
-
líneas (en
@CRLF
,@LF
o@CR
).
Misma longitud
StringMid()
devuelve parte de una cadena.
Se puede usar para dividir en partes de igual longitud.
Ejemplo (sin verificación de errores, seleccione y copie el texto
CTRL
+
C
primero):
#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
Unir cadena
Según la documentation :
_ArrayToString
Coloca los elementos de una matriz 1D o 2D en una sola cadena, separados por los delimitadores especificados
Ejemplo (agregue
_StringSplitEqual()
y seleccione y copie el texto
CTRL
+
C
primero):
#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)
Devoluciones:
$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."