necesita AppleScript para buscar en una tabla de 2 columnas, sin Excel, números, etc.

1

no sé qué tan elemental es una pregunta como esta, pero ...

• Tengo un archivo csv de 2 columnas en el que deseo buscar un valor en la columna A y luego capturar su valor coincidente en la columna B.

• Almacenaré el archivo csv en un paquete de AppleScript para mantener todo ordenado.

¿Hay alguna manera (buscar con grep?) para hacer esto y mantener una aplicación GUI separada (Excel, números, etc.) fuera de la ecuación?

    
pregunta nuthindoin 07.01.2017 - 03:37

2 respuestas

2

Puede usar la escritura de un script para leer su archivo CSV de dos columnas, y luego convertirlo en una lista donde tendría un elemento de lista para cada fila en su archivo CSV, y cada elemento de la lista sería una lista ( Valor de la columna A, valor de la columna B). Por lo tanto, si su archivo CSV se parece a esto:

red,apple
yellow,banana
green,pickle
brown,desk
white,sock

Se convertiría a esto:

{{red,apple},{yellow,banana},{green,pickle},{brown,desk},{white,sock}}

Entonces es fácil recorrer la lista y encontrar el primer elemento cuyo primer elemento coincida con el término de búsqueda. Por ejemplo, si estoy buscando "marrón", encontraría "marrón" en el ítem 4 de la lista más grande, y luego seleccionaré el ítem 2 del ítem 4 de la lista más grande, dando como resultado el "escritorio".

Aquí hay un script que le pide que elija un archivo CSV, luego le pide el término de búsqueda (lo que desea encontrar en la Columna A). A continuación, muestra el valor de la columna B en un cuadro de diálogo. Es posible que esto no resuelva completamente su problema, pero sí responde a su pregunta sobre la búsqueda de un archivo CSV utilizando AppleScript y no Excel o Numbers.

    tell application "Finder"
        set the_file to choose file
    end tell

    set my_data to read the_file
    set my_list to paragraphs of my_data as list
    -- we need to make a list of lists... each item in my_list needs to be a list of two items.
    set new_list to {}
    -- this is housekeeping
    set oldDelims to AppleScript's text item delimiters
    set AppleScript's text item delimiters to ","
    -- /housekeeping
    --
    --make the list look right
    repeat with an_item in my_list
    -- inserting "try" statement to catch blank lines
    try
        set x to text item 1 of an_item
        set y to text item 2 of an_item
        set component_list to {x, y}
        set end of new_list to component_list
    end try
    end repeat
    set AppleScript's text item delimiters to olddelims

    -- now you have a list with each item in the list
    -- being Columns A and B of one line in the CSV file
    --
    -- Bringing Finder to the front to make dialog boxes show more easily
    tell application "Finder"
      activate
      set the_search_term to display dialog "What are you looking for?" default answer "red"
      set the_search_term to text returned of the_search_term

      repeat with some_item in new_list
          if item 1 of some_item is the_search_term then
              display dialog "Column B value is: " & item 2 of some_item
              return
          end if
      end repeat
    end tell
    
respondido por el Christian Boyce 07.01.2017 - 10:51
0

He reescrito el script para que sea mucho más eficiente (y MUCHO más rápido). Pensé que sería útil ver el original y este, así que lo publicaré como una segunda respuesta.

Es un enfoque diferente. Primero, divido el archivo CSV en DOS listas: una llamada ColumnA_list y otra llamada ColumnB_list. Luego encuentro el término de búsqueda en ColumnA_list y apunto su posición. Luego voy directamente al elemento correspondiente en ColumnB_list. Esto elimina el segundo bucle en el script, lo que acelera las cosas MUCHO.

tell application "Finder"
    set the_file to choose file
end tell
--
set my_data to read the_file
set my_list to paragraphs of my_data as list
-- we need to make two lists: ColumnA, and ColumnB
set ColumnA_list to {}
set ColumnB_list to {}
-- this is housekeeping
set oldDelims to AppleScript's text item delimiters
set AppleScript's text item delimiters to ","
-- /housekeeping
--
--make the lists
repeat with an_item in my_list
    -- inserting "try" statement to catch blank lines
    try
        set end of ColumnA_list to text item 1 of an_item
        set end of ColumnB_list to text item 2 of an_item
    end try
end repeat
set AppleScript's text item delimiters to oldDelims
--
-- now you have two lists.
-- we will search ColumnA_list for the search term, then locate the corresponding item
-- in ColumnB_list
--
-- Bringing Finder to the front to make dialog boxes show more easily
tell application "Finder"
    activate
    set the_search_term to display dialog "What are you looking for?" default answer "red"
    set the_search_term to text returned of the_search_term
end tell
--
-- Now we find the line number of the item in ColumnA_list matching the earch term
set the_position to indexof(the_search_term, ColumnA_list)
-- "indexof" is Emmanuel Levy's routine-- thanks Emmanuel!
if the_position is 0 then
    tell application "Finder"
        activate
        display dialog "The search term does not exist in Column A."
    end tell
    return
end if
-- now we know which line has the search term, so we can specify the corresponding
-- item in ColumnB_list
tell application "Finder"
    display dialog "Column B value is: " & item the_position of ColumnB_list
end tell
--
-- This is Emmanuel Levy's routing
on indexof(theItem, theList) -- credits Emmanuel Levy
    set text item delimiters to return
    set theList to return & theList & return
    set text item delimiters to {""}
    try
        -1 + (count (paragraphs of (text 1 thru (offset of (return & theItem & return) in theList) of theList)))
    on error
        0
    end try
end indexof
    
respondido por el Christian Boyce 10.01.2017 - 08:35

Lea otras preguntas en las etiquetas