2 votos

Cómo hacer un motor de búsqueda personalizado en AppleScript

Así que tengo una base de datos de carpetas y archivos (.txt) y estoy tratando de crear un programa que me puede introducir las palabras clave y que la búsqueda de esos archivos, y que es la salida en el texto de los archivos que contengan las palabras clave. Tengo un código de trabajo que hace exactamente eso, pero no de la búsqueda de las palabras individualmente - busca las palabras juntos, como una sola cadena.

Por ejemplo, si yo de entrada "Joe proyecto de Ley de Bob," me gustaría que la salida de los archivos que contienen cada una de esas palabras en cualquier lugar en el archivo, incluso si no están uno al lado del otro, o en que orden.

Prefiero evitar hacer una repetición de un bucle para introducir un término de búsqueda a la vez.

También me gustaría, en lugar de evitar la creación de cientos de variables en el código, y hacer que se repita el bucle que si un personaje no es un espacio que se añade que en la primera en blanco variable y si es que se salta a la siguiente variable.

Si usted tiene cualquier otra idea, sería genial. Gracias!

1voto

Baczek Puntos 150

Nota: los archivos de texto deben ser codificados con el "UTF8" de la codificación.

He aquí una secuencia de comandos inicial:

Ejemplo: Las palabras clave:

"Bill
Bob
Joe"

fgrep y ordenar las líneas de retorno, como este :

/path/of/thisFile.txt:Bill
/path/of/thisFile.txt:Bob
/path/of/thisFile.txt:Joe
/path/of/thisFile2.txt:Bob
/path/of/thisFile2.txt:Joe
/path/of/thisFile3.txt:Bob
/path/subf1/of/some_File.txt:Bill
/path/subf3/of/some_xzzz_File.txt:Bill

La secuencia de comandos utiliza un bucle para comprobar la ruta de acceso de cada elemento de esta lista.

La secuencia de comandos de obtener la ruta de acceso desde el primer punto, se retire ":proyecto de Ley" al final de la línea --> por lo que la ruta es "/path/of/thisFile.txt".

La secuencia de comandos de verificación en el elemento (índice actual + el número de palabras clave -1), es el tercer elemento, por lo que el tercer elemento contiene el mismo camino, entonces la secuencia de comandos anexar el camino a una nueva lista de

Los demás elementos no contiene todas las palabras clave.


set r to text returned of (display dialog "What keywords?" default answer "Joe Bill Bob") --- each keyword must be sepearated by a space
set tKeys to my makeKeysForGrep(r)
if tKeys is not "" then
    set masterFolder to choose folder with prompt "Select the source folder .."
    set filesList to my getFilescontainingKeywords(masterFolder, tKeys) -- get a list of files ( each file contains all the keywords)
    --do something with the filesList -- this list contains path of type 'posix path' 
end if

on makeKeysForGrep(t)
    (***   delete trailing and leading spaces, replace multiple spaces in a row by one space (clean the string to avoid issue with the unnecessary spaces in the grep command),
     and replace the space character by a linefeed character , so each line contains a keyword.  ***)
    set r to do shell script "perl -pe 's/ +$|^ +//g; s/ +/ /g; s/ /\\n/g; '  <<< " & (quoted form of t) & "| sort -u" without altering line endings
    if r is not linefeed then return text 1 thru -2 of r -- remove the last line (it's a blank line)
    return "" -- r is a a blank line, so return ""
end makeKeysForGrep

on getFilescontainingKeywords(dir, tKeys)
    script o
        property tfiles : {}
    end script
    set numOfKeywords to count (paragraphs of tKeys) -- get the number of keywords
    set tFolder to quoted form of POSIX path of dir
    set o's tfiles to do shell script "fgrep -R -o -w  --include \"*.txt\" " & (quoted form of tKeys) & " " & tFolder & " | sort -u"
    -- fgrep return the full path + ":" + the keyword, sort -u  : sort the paths and deletes duplicate lines (because the same file can contains multiple occcurences of a keyword)

    if o's tfiles is not "" then
        if numOfKeywords = 1 then return o's tfiles -- no need to continue because one keyword only,  return all Files
        set l to {}
        set o's tfiles to paragraphs of o's tfiles
        set tc to count o's tfiles
        set firstKeyword to ":" & (paragraph 1 of tKeys)
        set numCh to (length of firstKeyword) + 1
        set i to 1
        repeat while (i < tc) -- check each path in the list, the same path must exists  numOfKeywords  in a row 
            set thisItem to (item i of o's tfiles)
            if thisItem ends with firstKeyword then
                set textFilepath to text 1 thru -numCh of thisItem
                set j to (i + numOfKeywords - 1)
                if j > tc then exit repeat
                if (item j of o's tfiles) starts with textFilepath then -- this file contains all the keywords
                    set end of l to textFilepath --- append this path to the list
                    set i to i + numOfKeywords -- to skip items wich contains the same path
                else
                    set i to i + 1 -- next file
                end if
            else
                set i to i + 1 -- next file
            end if
        end repeat
        return l -- list of files which contains all the keywords
    end if
    return {} -- No files found
end getFilescontainingKeywords

Las opciones de fgrep :

  • El --include \"*.txt\" opción : sólo los archivos que coincidan con el dado patrón de nombre de archivo en las que se busca, por lo que cualquier nombre que terminan con ".txt"

    El -w opción : concordancia de palabra solamente, así que Bob no coincide con Bobby, eliminar esta opción si desea encontrar una subcadena en el texto.

    El -R opción : buscar de forma recursiva subdirectorios, quitar esta opción si no desea que la recursividad.

    Añadir el -i opción para realizar la coincidencia de mayúsculas y minúsculas. Por por defecto, fgrep es sensible a mayúsculas y minúsculas.

0voto

Oskar Puntos 1242

Usted podría incluso no necesita de AppleScript. Buscador admite búsquedas Booleanas como una función avanzada. Puedes guardar la búsqueda y volver a utilizar o hacer ad-hoc a sus necesidades.

Un valor Booleano consulta utiliza y, O Y NO (conocido como operadores Booleanos) para limitar los resultados de búsqueda. También puede utilizar un signo menos (–), lo que significa Y por que NO, para excluir los elementos cuando usted busca.

Su pedido cláusula será problemático, ya que spotlight no exponer (o no siete considerar en primer lugar) de la orden de los resultados - que la cadena se encuentra en el archivo.

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