1 votos

Hacer que AppleScript convierta una variable en los elementos entre dos elementos especificados

set theList to {"1", "", "", "apple", "acda", "", "3454", "ImportantStuff", "important1", "important2", "important3", "NotImportantStuff", "2", "", "efrg"}
set theImportant to items between "ImportantStuff" and "NonImportantStuff" of theList

Cómo hago para que AppleScript tome los ítems entre "CosasImportantes" y "CosasNoImportantes" y asigne una variable a esos ítems. la variable "theList" es un sustituto, la cantidad de ítems que son importante (entre los dos elementos especificados) es indefinido--junto con la cantidad de elementos antes y después de los elementos especificados.

1voto

qarma Puntos 71

He aquí una implementación alternativa que será más rápida y mucho más compacta:

set L to {"1", "", "", "apple", "acda", "", "3454", "ImportantStuff", ¬
   "important1", "important2", "NotImportantStuff", "2", "", "efrg"}

set {i, j} to {1, -1}

tell L
    repeat until item i = "ImportantStuff"
        set i to i + 1
    end repeat
    repeat until item j = "NotImportantStuff"
        set j to j - 1
    end repeat
end tell

return items (i + 1) thru (j - 1) of L
-- OR: set myVar to items (i + 1) thru (j - 1) of L

No itera a través de cada elemento de la lista, ya que eso hace perder tiempo. En lugar de eso, nos centramos desde la izquierda para encontrar el índice donde empieza lo importante; luego nos centramos desde la derecha para encontrar el índice donde termina lo importante.

A continuación, basta con recuperar los elementos comprendidos entre esos dos índices.

Método 2: Manipulación de texto

De forma menos general, si sabe que su lista sólo contiene elementos de texto simple, puede utilizar text item delimiters para convertir la lista en una cadena y manipularla:

set my text item delimiters to linefeed

set L to {"1", "", "", "apple", "acda", "", "3454", "ImportantStuff", "important1", ¬
   "important2", "important3", "NotImportantStuff", "2", "", "efrg"}

set textList to L as text

set my text item delimiters to {"ImportantStuff", "NotImportantStuff"}

set importantStuffText to text item 2 of textList

La primera serie de text item delimiters transforman la lista en una cadena en la que cada elemento de la lista ocupa una sola línea de la cadena. El segundo conjunto de text item delimiters divide la cadena en los dos lugares donde se encuentran las palabras clave. Esto nos permite recuperar los bits intermedios, que, tal como está, devolverá:

"
important1
important2
important3
"

Si hay varias apariciones de las palabras clave, lo importante serán todas las que sean pares. text items .

Para volver a convertir la cadena en una lista, puedes hacer lo siguiente:

set importantStuffList to paragraphs 2 thru -2 of importantStuffText
    --> {"important1", "important2", "important3"}

0 votos

Es increíble ver cómo se puede compactar el lenguaje AppleScript, típicamente verboso.

0 votos

En este caso, no es que haya utilizado una sintaxis AppleScript más breve, sino que he utilizado un algoritmo más breve en mi planteamiento.

0voto

Steve Evans Puntos 155

Filtro manual

Un método consiste en filtrar manualmente la lista con un repeat bucle:

set theList to {"1", "", "", "apple", "acda", "", "3454", "ImportantStuff", "important1", "important2", "important3", "NotImportantStuff", "2", "", "efrg"}

-- put the filtered items into subList
set subList to {}

-- note when iterating through important items
set withinImportant to false

-- examine every item in the list
repeat with i from 1 to length of theList
    set anItem to item i of theList

    -- are we within an important section?
    if withinImportant then

        -- have we reached the end of the important section?
        if anItem is "NotImportantStuff" then
            set withinImportant to false
        else
            -- append to subList
            set subList to subList & anItem
        end if

    else

        -- is this item the start of the important items
        if anItem is "ImportantStuff" then
            set withinImportant to true
        end if
    end if
end repeat

Véase Manipulación de listas de elementos y Ejemplos de AppleScript "list para ver más ejemplos de cómo trabajar con listas en AppleScript.

0 votos

Puede salir del bucle de repetición una vez que llegue al final de la sección importante, lo que ahorraría iterar por elementos innecesarios al final. Pero, en general, podría ser mejor (muchas menos operaciones y más eficiente en términos de espacio dependiendo del método final) si, en lugar de construir una lista de trabajo de elementos de forma iterativa, se buscara el índice de los dos elementos pertinentes de la lista y luego se utilizara para devolver items x thru y of theList .

0 votos

Merece la pena experimentar con las mejoras de CJK. La implementación de esta respuesta recogerá múltiples bloques de "cosas importantes", pero la de CJK es más compacta.

0 votos

Recibo error "Can’t set sublist of {} to some object." number -10006 from «class LST-» of {} al intentar ejecutar este script. sublist se muestra en negrita azul como un comando pero no tengo nada en Plug-ins en Preferencias de script Editor. Después de buscar un poco, he encontrado que tenía Satimage instalado. Lo que ahora explica algunas otras anomalías que me he encontrado últimamente.

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X