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).
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 ejemplo23
. Resumen: SÍ:{"24", "23", "22", "21", "20"}
; NO:{24, 23, 22, 21, 20}
. ¿Correcto?0 votos
Y... ¿Qué pasa con las representaciones no enteras y los ceros iniciales o finales? ¿Debería
"0abc.12300"
volver como"0.12300"
o".12300"
o".123"
o"012300"
o"12300"
?0 votos
No debe haber números que no sean enteros, pero si aparece un punto antes, después o entre un número, también debe eliminarse. Si hay un 0 a la izquierda, hay que bajar al número sin él. Así, "0abc.12300" debe ser "12300".
0 votos
No importa si son representaciones textuales del número o el propio número. Pero sí, el preferido es que sean representaciones de texto.