2D List中から、ヘッダー行とヘッダー列の(はずの)場所からマーカーを特定し、Xマーカー、Yマーカーの交点座標の値をピックアップして返すAppleScriptです。
これまでにも、2D List(2次元配列9からXマーカー、Yマーカーを個別に指定して、交点座標の値をピックアップするScriptは使っていました。
ところが、実際に投入してみたところXマーカーに該当する文字列が複数ピックアップされる例が出てきたため、「何個目のマーカーを使用するか」「ヘッダー行の何行目までサーチするか」といった追加の機能が必要になってきました。そのための試作品です。
ヘッダー行がユニーク化されていないCSVとか、驚きでアゴが外れそうになるデータにお目にかかったので、その対策のために作ったものです。
AppleScript名:2D List中から、複数アイテムが存在するマーカーのx番目のXYマーカーの交点のデータを返す v1 |
— – Created by: Takaaki Naganoya – Created on: 2019/01/24 — – Copyright © 2019 Piyomaru Software, All Rights Reserved — use AppleScript version "2.4" — Yosemite (10.10) or later use framework "Foundation" use scripting additions use Bplus : script "BridgePlus" –https://www.macosxautomation.com/applescript/apps/BridgePlus.html set anXItem to "a" set anXItemNum to 3 set anYItem to "z" set anYItemNum to 1 set aList to {{"b", "a", "a", "a"}, {"x", "1x", "2x", "3x"}, {"y", "1y", "2y", "3y"}, {"z", "1z", "2z", "3z"}} set aRes to getItemFromList(aList, anXItem, anXItemNum, anYItem, anYItemNum) of me –> "3z" on getItemFromList(aList as list, anXItem, anXItemNum as integer, anYItem, anYItemNum as integer) set xRes to findDataFrom2DList(anXItem, aList, 2) of me –> {{2, 1}, {4, 1}} if length of xRes < anXItemNum then error "X-item Fewer Hits" set yRes to findDataFrom2DList(anYItem, aList, -1) of me –> {{1, 4}} if length of yRes < anYItemNum then error "Y-item Fewer Hits" set xPosRes to item 1 of contents of item anXItemNum of xRes set yPosRes to item 2 of contents of item anYItemNum of yRes set aRes to item xPosRes of item yPosRes of aList return aRes end getItemFromList on findDataFrom2DList(anItem, aList as list, yMax as integer) script spd property aList : {} property resList : {} end script set (aList of spd) to aList set (resList of spd) to {} set yCount to 1 repeat with i in (aList of spd) set aResList to (Bplus’s indexesOfItem:anItem inList:i inverting:false) as list set tmpList to {} if aResList is not equal to {} then repeat with ii in aResList set jj to contents of ii set the end of tmpList to {jj, yCount} end repeat set (resList of spd) to (resList of spd) & tmpList end if set yCount to yCount + 1 if (yMax is not equal to -1) and (yCount > yMax) then exit repeat end repeat return (resList of spd) –return {{x, y}…..} item list (1-based) end findDataFrom2DList |
More from my site
(Visited 52 times, 1 visits today)