5 votos

¿Cómo fijar una variable a todos los números situados en una lista?

Digamos que tengo una variable configurada así:

set myVar to {"asdf", "qwerty24", "23", "22", "21abc" "20"}

Cómo puedo establecer una variable con los números de miVar, incluyendo los que tienen texto dentro del elemento, pero sin mantener la parte que es texto. Cada elemento debe contener sólo un número, si un elemento se compone de varios números, es decir, "302 303", entonces el resultado de salida sería preferiblemente sólo combinado a "302303". Los espacios en el elemento deben ser eliminados, al igual que el texto. Si cada número tiene que ser un entero, "0abc.1200" tiene que tener su punto eliminado y el resultado es "1200". El resultado sería preferiblemente listado como {"24", "23", "22", "21", "20"}, en lugar de ser listado como {24, 23, 22, 21, 20}.

1 votos

¿Podría dar una lista más variada de ejemplos y, sobre todo, cuál sería el resultado deseado? Por ejemplo, ¿debería "123abc456" mapa a {"123", "456"} o simplemente "123" o simplemente "456" o "123456" o "123 456" ? Un elemento aparentemente sencillo da lugar a múltiples soluciones posibles, y no hay forma de saber cuál es la que consideras "correcta". Tienes que ser específico y tratar de cubrir todos los escenarios, de lo contrario no obtendrás soluciones óptimas. Puedes editar la pregunta para cambiar/añadir información según sea necesario.

0 votos

Vale he añadido algo más de información sobre lo que quiero que sea el resultado. La solución que quiero de esto es bastante amplia por lo que realmente no importa lo que se asigna a, siempre y cuando todo el texto se elimina de cada elemento.

1 votos

Eso está un poco más claro. Otra cosa: has sido impreciso con tu definición de lo que "texto" es y lo que es un "número" es. Creo que sé lo que quieres, pero para que quede claro: ¿quieres decir que sólo quieres dígito caracteres retenidos en el texto, pero los elementos finales para permanecer como texto, por ejemplo "23" (esto es no un número; es un texto que contiene caracteres numéricos, y forma una representación textual de un número); y que hace no quiere que los elementos finales se devuelvan como números, por ejemplo 23 . Resumen: SÍ: {"24", "23", "22", "21", "20"} ; NO: {24, 23, 22, 21, 20} . ¿Correcto?

3voto

qarma Puntos 71

Objetivo: procesar un AppleScript lista de cadenas, de manera que cada cadena se filtra para eliminar cualquier no-dígito seguido por todos los ceros a la izquierda. Resultante de las cadenas vacías son desechados.

property digits : "0123456789"
property text item delimiters : {}


set L to {"abc", "qwerty.24", "01 abc23xyz", "123abc456", "2.1abc", "20"}

repeat with textItem in L
    set stringOfDigits to filterCharacters from textItem thru digits
    set numericalString to the processedNumericalString(stringOfDigits)

    set the contents of the textItem to the numericalString
end repeat

return the strings in L --> {"24", "123", "123456", "21", "20"}

------------------------------------------------------------------------------------------
# HANDLERS:
to filterCharacters from someText as text thru allowedCharacters as text
    local someText, allowedCharacters

    set tid to my text item delimiters -- to reset them after

    set my text item delimiters to {missing value} & characters in the allowedCharacters
    set illegalCharacters to characters of (text items of someText as text)

    set my text item delimiters to {missing value} & the illegalCharacters
    set filteredText to the text items of someText as text

    set my text item delimiters to tid
    return the filteredText
end filterCharacters


on processedNumericalString(numericalString as text)
    local numericalString

    if the numericalString = "" then return missing value

    try
        the numericalString as number
    on error
        the numericalString
    end try

    return the result as text
end processedNumericalString

Desglose

property declaraciones

Un property es similar a una variable, excepto por dos diferencias: las propiedades son persistentes, y tienen un alcance global; las variables se eliminan cuando el script finaliza, y por defecto a un ámbito local. Voy a dejar que la investigación de los términos, si usted necesita, ya que es más allá de las atribuciones de esta respuesta. Yo casi nunca uso un property para cualquiera de las características que acabo de mencionar. Más bien, yo lo utilizo más a menudo para separar el almacenamiento de los valores que en general tiene la intención de permanecer constante a lo largo de la secuencia de comandos (en contraposición a las variables que se pueden esperar cambiar en cualquier momento). AppleScript no tiene una forma de declarar constantes como otros idiomas, así que esto es sólo una perversión de otra construcción.

Los controladores

Los controladores en AppleScript puede ser pensado para ser lo que otros idiomas se refieren a como una función, y el valor real de las diferencias son de matices y sobre todo académico, con una implicación práctica de ser que los controladores no son conscientes de sí mismos, así que no puede reportar cualquier información sobre sí mismos de nuevo a usted. Pero, al igual que las funciones, reciben argumentos (o parámetros), hacer algo con ellos, y escupir un resultado al final en la mayoría de los casos.

  • filterCharacters: este es el núcleo de la secuencia de comandos en términos de donde el trabajo pesado se hace. Se recibe de una sola pieza de texto que desea ser filtrada, y una lista de caracteres permitidos, y elimina todo lo demás, es decir, los extractos de las apariciones de caracteres permitidos en el orden en que se producen. Esto se hace mediante la utilización de AppleScript de la text item delimiters, el cual debe leer acerca más a fondo, pero que esencialmente elimina todas las instancias de delimitadores en la lista de la oferta, se divide la cadena en los fragmentos en los puntos de eliminación. Así, es casi la realización de la función opuesta a la que queremos, y puede ser el pensamiento de ser un filtro de texto que se suministra una lista de los ilegales en lugar de una lista de allowables. Por lo tanto, yo uso dos veces: la primera tira de la allowables, dejando sólo los ilegales; a continuación, dar la lista de ilegales de vuelta a text item delimiters, lo que, a continuación, se despojaron de la pieza original del texto, lo que nos deja sólo con allowables. Muy eficiente, evita la iteración a través de los personajes en el texto.

  • processedNumericalString(): Este controlador es sólo un barato y de forma perezosa a la franja de los ceros a la izquierda una vez que el primer controlador nos ha dado una cadena que contiene sólo dígitos. Sería, sin duda, más correcta para iterar a través de cada dígito hasta llegar a la primera no-cero de caracteres, eliminando los que son, con un caso especial para prevenir "0" de ser borrado. Pero, en su lugar, me decidí a obligar a la string a number, luego de vuelta a un string. Un hack que funciona de manera efectiva y se asume con mayor rapidez demasiado (aunque no definitivo).

El cuerpo principal de la secuencia de comandos

Con los dos controladores definidos en la parte inferior de la secuencia de comandos, todo lo que queda es recorrer la lista de cadenas de texto, envío de cada cadena a cada controlador. Lo que vuelve es el trozo de texto que deseo, que set the contents of... es lo que me permite reemplazar el elemento original en la lista con la nueva versión. Yo era consciente de no retener las cadenas vacías (""), y el processedNumericalString() controlador de swaps de aquellos a cabo por un AppleScript objeto llamado missing value que representa exactamente lo que dice (que es la más cercana a la pre-definido de AppleScript objeto a qué otros idiomas, a menudo llamada null o nil). De todos modos, lo importante de esto es que no es un string, debido a que la última línea del script a ejecutar es:

return the strings in L

y esto hace exactamente eso: cualquier elemento en la lista que no es un string (o text) clase de objeto se descarta. Usted puede, por supuesto, de intercambio de esta línea para:

set myVar to the strings in L

si usted necesita que se le asigna a una variable para guardar el usar de él.


ANEXO

La OP agregada:

La lista que he descrito como myVar en el post original está siempre cambiando con el tiempo, quiero que el proceso de tomar los elementos en myVar y el aislamiento de todos los números para repetir indefinidamente

OK. Vamos a poner el tapón en la parte principal de la secuencia de comandos en otro controlador:

to formNumericalStringsWithItems from L as list
    local L

    repeat with textItem in L
        set stringOfDigits to filterCharacters from textItem thru digits
        set numericalString to the processedNumericalString(stringOfDigits)

        set the contents of the textItem to the numericalString
    end repeat

    return the strings in L
end formNumericalStringsWithItems

Lugar de esto con los otros controladores para mantenerlo separado y fuera de la manera que ahora. El cuerpo principal de la secuencia de comandos se reduce a estas dos líneas, donde he utilizado el identificador myVar en lugar de L sólo para aclarar:

set myVar to {"abc", "qwerty.24", "01 abc23xyz", "123abc456", "2.1abc", "20"}
set myNewAndImprovedVar to formNumericalStringsWithItems from myVar

Ahora, dondequiera myVar en su secuencia de comandos se actualiza/cambiado, sigue con un llamado a este nuevo controlador, como he ilustrado aquí.

Acaba de ser claro acerca de cómo he delineado las distintas "partes" de la secuencia de comandos: mantener el property declaraciones en la parte superior-no poner dentro de su repetición en bucle; también no poner las declaraciones del controlador dentro de la repetición en bucle que poner todos de la mina en la parte inferior de la secuencia de comandos, donde he marcado una línea y se dirigió una sección sólo para los manipuladores. El "cuerpo principal" de la secuencia de comandos (a pesar de que ahora sólo dos líneas aquí) es lo que el código se ocupa, a fin de mantener las cosas ordenadas y agrupadas (es por eso que me separan de la property declaraciones desde el cuerpo principal por dos saltos de párrafo en lugar de sólo uno).

0 votos

Actualizaré la respuesta con alguna explicación de lo que hace el script.

0 votos

¿Cómo puedo hacer que esto se repita indefinidamente? No me permite poner esto dentro de un ciclo de repetición.

0 votos

No entiendo lo que quieres decir. ¿Puede aclarar lo que quiere hacer?

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