1 votes

Besoin d'un AppleScript pour effectuer une recherche dans un tableau à 2 colonnes, sans Excel, Numbers, etc.

Je ne sais pas si une telle question est élémentaire, mais...

- J'ai un fichier csv à 2 colonnes dans lequel je veux rechercher une valeur dans la col A et ensuite saisir la valeur correspondante dans la col B.

- Je stockerai le fichier csv dans un paquet AppleScript pour garder les choses en ordre.

Existe-t-il un moyen (recherche avec grep ?) d'y parvenir et de ne pas utiliser une application GUI distincte (Excel, Numbers, etc.) ?

2voto

Christian Boyce Points 1052

Vous pouvez écrire un script pour lire votre fichier CSV à deux colonnes, puis le convertir en une liste où vous aurez un élément de liste pour chaque ligne de votre fichier CSV, et chaque élément de liste sera lui-même une liste (valeur de la colonne A, valeur de la colonne B). Ainsi, si votre fichier CSV ressemble à ceci :

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

Il serait converti en ceci :

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

Il est alors facile de parcourir la liste et de trouver le premier élément qui correspond au terme recherché. Par exemple, si je cherche "marron", je trouverai "marron" dans l'élément 4 de la liste plus large, puis je choisirai l'élément 2 de l'élément 4 de la liste plus large, ce qui donnera "bureau".

Voici un script qui vous demande de choisir un fichier CSV, puis vous demande le terme de recherche (ce que vous voulez trouver dans la colonne A). Il affiche ensuite la valeur de la colonne B dans une boîte de dialogue. Cela ne résout peut-être pas complètement votre problème, mais cela répond à votre question concernant la recherche d'un fichier CSV à l'aide d'AppleScript et non d'Excel ou de 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

0voto

Christian Boyce Points 1052

J'ai réécrit le script pour qu'il soit beaucoup plus efficace (et BEAUCOUP plus rapide). J'ai pensé qu'il serait utile de voir l'original en plus de celui-ci, donc je poste ceci comme deuxième réponse.

Il s'agit d'une approche différente. Tout d'abord, j'ai divisé le fichier CSV en DEUX listes, l'une appelée ColumnA_list et l'autre ColumnB_list. Je trouve ensuite le terme recherché dans ColumnA_list et je note sa position. Je passe ensuite directement à l'élément correspondant dans ColumnB_list. Cela élimine la deuxième boucle dans le script, ce qui accélère considérablement les choses.

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

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X