ha bisogno di AppleScript per cercare una tabella a 2 colonne, senza Excel, numeri, ecc.

1

non so quanto sia elementare una domanda come questa, ma ...

• Ho un file csv a 2 colonne che voglio cercare un valore in col A e poi prendere il suo valore corrispondente in col B.

• Conserverò il file csv in un pacchetto AppleScript per mantenere le cose in ordine.

C'è un modo (cerca con grep?) per fare ciò e tenere un'app separata per la GUI (Excel, Numbers, ecc.) fuori dall'equazione?

    
posta nuthindoin 07.01.2017 - 03:37
fonte

2 risposte

2

Puoi usare scrivere uno script per leggere il tuo file CSV a due colonne e quindi convertirlo in un elenco in cui avresti un elemento di elenco per ogni riga nel tuo file CSV e ogni elemento di elenco sarebbe esso stesso un elenco ( colonna A valore, colonna B valore). Quindi, se il tuo file CSV assomiglia a questo:

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

Sarebbe convertito in questo:

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

Quindi è facile scorrere l'elenco e trovare il primo elemento il cui primo elemento corrisponde al termine di ricerca. Ad esempio, se sto cercando "brown", troverei "brown" nell'elemento 4 dell'elenco più grande, quindi seleziono l'elemento 2 dell'elemento 4 dell'elenco più grande, risultando in "desk".

Ecco uno script che ti chiede di scegliere un file CSV, quindi ti chiede il termine di ricerca (la cosa che vuoi trovare nella Colonna A). Quindi visualizza il valore di Colonna B in una finestra di dialogo. Questo potrebbe non risolvere completamente il tuo problema, ma risponde alla tua domanda riguardante la ricerca di un file CSV utilizzando AppleScript e non 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
    
risposta data 07.01.2017 - 10:51
fonte
0

Ho riscritto lo script per essere molto più efficiente (e molto più veloce). Ho pensato che sarebbe stato utile vedere l'originale così come questo, quindi lo sto postando come seconda risposta.

È un approccio diverso. Per prima cosa ho diviso il file CSV in DUE liste: uno chiamato ColumnA_list e uno chiamato ColumnB_list. Quindi trovo il termine di ricerca in ColumnA_list e ne noti la posizione. Quindi vado direttamente all'elemento corrispondente in ColumnB_list. Questo elimina il secondo ciclo nello script, velocizzando le cose di un LOT.

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
    
risposta data 10.01.2017 - 08:35
fonte

Leggi altre domande sui tag