Перейти на главную страничку сайта (список статей, файлы для скачивания)

ФОРУМ (здесь можно обсудить эту статью, а также саму программу AutoHotkey и проблемы её использования)

Проект перевода документации AutoHotkey: перечень переведённых статей и статей в работе.

Оригинал статьи в AutoHotkey.chm: "Loop (parse a string)", в содержании - "String Management" - "Loop (parse a string)", v1.0.48.03.

Ник переводчика: YMP.

Настоящее имя переводчика: Юрий Попов.

Loop (parse a string)

Извлекает подстроки (поля) из указанной строки, одну за другой.

Loop, Parse, InputVar [, Delimiters, OmitChars]

Параметры

Parse Этот параметр должен быть словом Parse, и в отличие от других типов циклов он не может быть переменной, содержащей слово Parse.
InputVar Имя переменной, чьё содержимое будет разбираться. Не заключайте это имя в знаки процента, кроме случая, когда вы хотите, чтобы содержимое переменной было использовано в качестве имени.
Delimiters Разделители. Если этот параметр пустой или опущен, каждый символ в InputVar будет трактоваться как отдельная подстрока.

Если этот параметр задать как CSV, InputVar будет разбираться в соответствии со стандартным форматом значения, разделённого запятыми (comma separated value). Вот пример строки CSV, произведённой MS Excel: "first field",SecondField,"the word ""special"" is quoted literally",,"last field, has literal comma"

Иначе укажите в Delimiters один или несколько символов (чувствительны к регистру), каждый из которых будет использован для определения границ между подстроками в InputVar.

Сами разделяющие символы не считаются частью подстрок. Если между двумя разделителями в InputVar ничего нет, соответствующая подстрока получится пустой.

Например: `, (экранированная запятая) приведёт к разделению на подстроки во всех местах, где в InputVar встречается запятая. Аналогично, %A_Tab%%A_Space% означает, что новая подстрока начинается каждый раз, когда в InputVar встречается пробел или табуляция.

Чтобы в качестве разделителя использовать строку, а не одиночный символ, сначала используйте StringReplace, чтобы заменить все вхождения этой строки на одиночный символ, который никогда не используется в тексте как литерал, например, один из этих специальных символов: ¢¤¥¦§©ª«®µ¶. В следующем примере строка <br> используется как разделитель:
StringReplace, NewHTML, HTMLString, <br>, ¢, All
Loop, parse, NewHTML, ¢ ; Разделить строку по символу цента.
{
...
}
OmitChars Необязательный список символов (чувствителен к регистру), которые должны убираться с начала и с конца каждой подстроки. Например, если OmitChars задан как %A_Space%%A_Tab%, в начале и конце подстрок (но не в середине) будут удаляться пробелы и табуляции.

Если параметр Delimiters пустой, OmitChars указывает, какие символы должны игнорироваться при разборе (цикл не будет их видеть).

В отличие от последнего параметра большинства других команд, запятые в OmitChars должны экранироваться (`,).

Примечания

Цикл разбора полезен, когда вы хотите обрабатывать каждое поле в строке по-отдельности, одно за другим. Циклы разбора потребляют меньше памяти, чем StringSplit (поскольку StringSplit создаёт постоянный массив) и в большинстве случаев проще в использовании.

Встроенная переменная A_LoopField существует в каждом цикле разбора. Она содержит текущую подстроку (поле) из InputVar. Если данный цикл выполняется внутри другого цикла разбора, поле внутреннего цикла будет иметь преимущество.

Не существует ограничений на размер InputVar или её полей. Кроме того, если содержимое InputVar изменится в процессе работы цикла, цикл не увидит этих изменений, так как он работает с временной копией её содержимого.

Чтобы перед разбором изменить порядок расположения полей, используйте команду Sort.

Смотрите в описании команды Loop информацию о блоках кода, командах Break, Continue и переменной A_Index, (которая существует во всех типах циклов).

Примеры

; Пример №1:
Colors = красный,зеленый,синий
Loop, parse, Colors, `,
{
    MsgBox, Цвет номер %A_Index%: %A_LoopField%.
} 

; Пример №2: Считывает текст из переменной построчно (аналогично циклу
; чтения файла). Файл можно загрузить в переменную командой FileRead.
Loop, parse, FileContents, `n, `r  ; Указание `n перед `r позволяет разбирать
                                   ; как файлы Windows, так и Unix.
{
    MsgBox, 4, , Строка номер %A_Index% содержит: %A_LoopField%.`n`nПродолжить?
    IfMsgBox, No, break
} 

; Пример №3. То же, что и выше, но предназначено для буфера обмена.
; Полезно в случае, когда буфер обмена содержит файлы, например, после
; копирования из окна Проводника (программа автоматически преобразует
; такие файлы в их имена).
Loop, parse, clipboard, `n, `r
{
    MsgBox, 4, , Файл номер %A_Index%: %A_LoopField%.`n`nПродолжить?
    IfMsgBox, No, break
} 

; Пример №4. Разбор файла, содержащего текст в формате значения,
; разделённого запятыми (CSV).
Loop, read, C:\Database Export.csv
{
    LineNumber = %A_Index%
    Loop, parse, A_LoopReadLine, CSV
    {
        MsgBox, 4, , Поле %LineNumber%-%A_Index%:`n%A_LoopField%`n`nПродолжить?
        IfMsgBox, No
            return


    }
}

Перейти на главную страничку сайта (список статей, файлы для скачивания)

© 2007 http://www.script-coding.com При любом использовании материалов сайта обязательна ссылка на него как на источник информации, а также сохранение целостности и авторства материалов.