拆分大字符串
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了拆分大字符串相关的知识,希望对你有一定的参考价值。
我有一个长文本需要转换为小字符串,所以我可以将它包含在AutoIt脚本中。如果我包含多行文本,它会显示error unterminated string
。所以我应该:
"numbercharswillbe10" &_ "othernumbersofcharwillbe10" &_ etc..
我如何用& _
-delimiters拆分它?
字符串连接
根据Documentation - Language Reference - Operators:
&
连接/连接两个字符串。
&=
连接任务。
例:
Global $g_sText = "Long " & "string " & "here." & @CRLF
$g_sText &= "More text." & @CRLF
ConsoleWrite($g_sText)
多行声明
根据Documentation - Language Reference - Comments(强调添加,因为它导致提到“未终止字符串”错误):
虽然每行只允许一个语句,但如果在“损坏”行的末尾放置一个以空格开头的下划线“
_
”,则长语句可以跨越多行。字符串定义不能分成几行,需要使用串联。
例:
Global Const $g_sText = "Long " & _
"string " & _
"here." & _
@CRLF & _
"More text." & _
@CRLF
ConsoleWrite($g_sText)
双引号
根据Documentation - FAQ - Double quotes:
如果你想在字符串中使用双引号,那么你必须“加倍”。因此,对于您想要的每一个引用,您应该使用两个。 ...
或者用单引号代替......
Examples可从源头获得。
默认值和限制
根据Documentation - Appendix - Limits/defaults:
4095
一行脚本的最大大小。
2,147,483,647
最大字符串长度。
根据Documentation - Language Reference - Datatypes - Strings:
所有AutoIt字符串都使用UTF-16(实际上更准确地说是UCS-2)编码。
根据Documentation - Intro - Unicode Support:
AutoIt的一些部分还没有完全的Unicode支持。这些是:
Send和ControlSend - 相反,使用ControlSetText或剪贴板功能。 控制台操作转换为ANSI。
备择方案
hard coding的替代品包括ClipGet()
和FileRead()
。
Text from clipboard
示例(首先选择并复制文本CTRL + C):
Global Const $g_sText = ClipGet()
ConsoleWrite($g_sText & @CRLF)
Text from file
示例(首先创建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()
(related)和StringMid()
。
Structural
StringSplit()
将一个字符串拆分为以下数组:
- 个别字符(在空分隔符上),
- 单词(在空间
分隔符)或
- 线(在
@CRLF
,@LF
或@CR
分隔符上)。
Equal length
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
将1D或2D数组的元素放入单个字符串中,由指定的分隔符分隔
示例(添加_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."
以上是关于拆分大字符串的主要内容,如果未能解决你的问题,请参考以下文章
为啥将拆分为 wav 文件的旋律转换为拆分的 mp3 会在片段边界处产生不好的声音?