1 votos

necesidad de AppleScript para buscar un 2 columna de la tabla, w/o Excel, Números, etc

no sé cómo elemental una pregunta como esta, pero...

• Tengo un 2 columna archivo csv que quiero buscar un valor en Una col y luego agarra su valor coincidente en la col B.

• Me va a almacenar el archivo csv en un AppleScript bundle para mantener las cosas ordenadas.

Hay una manera de (búsqueda con grep?) para ello, y mantener una separada de la GUI de la aplicación (Excel, Números, etc) de la ecuación?

2voto

Seif Puntos 121

Usted puede usar la función escribir una secuencia de comandos para leer sus dos columnas del archivo CSV y, a continuación, convertirlo en una lista donde usted tendría un elemento de la lista para cada fila en el archivo CSV, y cada elemento de la lista podría ser en sí mismo una lista (columna Un valor, el valor de la columna B). Por lo tanto, si su archivo CSV se veía así:

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

Sería convertido a este:

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

Entonces es fácil para recorrer la lista y encontrar el primer elemento cuyo primer elemento coincide con el término de búsqueda. Por ejemplo, si estoy buscando un "marrón" que me iba a encontrar "marrón" en el punto 4 de las más grandes de la lista y, a continuación, recoger el punto 2 del artículo 4 de la lista más grande, lo que resulta en el "escritorio".

Aquí es un script que se le pide que elija un archivo CSV, luego le pide que para el término de búsqueda (lo que usted desea encontrar en la Columna a). A continuación, muestra el valor de la Columna B en un cuadro de diálogo. Esto no puede resolver completamente el problema, pero sí responder a su pregunta acerca de la búsqueda en un archivo CSV usando AppleScript y no de Excel o Números.

    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

0voto

Seif Puntos 121

He reescrito el guión ser mucho más eficiente (y MUCHO más rápido). Pensé que sería útil para ver el original como este, así que estoy publicando esto como una segunda respuesta.

Es un enfoque diferente. Primero se divide el archivo CSV en DOS listas: uno llamado ColumnA_list y uno llamado ColumnB_list. Me encuentro con el término de búsqueda en ColumnA_list y tenga en cuenta su posición. Luego me voy directamente al elemento correspondiente en ColumnB_list. De esta forma se elimina el segundo bucle en la secuencia de comandos, acelerando 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

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