AppleScript名:1D Listから条件抽出(正規表現2) |
— Created 2017-11-03 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4949 property NSPredicate : a reference to current application’s NSPredicate property NSArray : a reference to current application’s NSArray set aList to {"123456789X", "9876x", "987654321x", "1234567890", "12345X", "1234567890X", "999999999X", "1111111111", "222222222X"} set anArray to NSArray’s arrayWithArray:aList set aPred to NSPredicate’s predicateWithFormat:"SELF MATCHES ’\\\\d{10}|\\\\d{9}[Xx]’" set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list –> {"123456789X", "987654321x", "1234567890", "999999999X", "1111111111", "222222222X"} |
カテゴリー: list
1D Listから条件抽出(正規表現1)
AppleScript名:1D Listから条件抽出(正規表現1) |
— Created 2017-11-03 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4949 property NSPredicate : a reference to current application’s NSPredicate property NSArray : a reference to current application’s NSArray set aList to {"TATACCATGGGCCATCATCATCATCATCATCATCATCATCATCACAG", "CGGGATCCCTATCAAGGCACCTCTTCG", "CATGCCATGGATACCAACGAGTCCGAAC", "CAT", "CATCATCATGTCT", "DOG"} set anArray to NSArray’s arrayWithArray:aList set aPred to NSPredicate’s predicateWithFormat:"SELF MATCHES ’.*(CAT){3,}(?!CA).*’" set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list –> {"CATCATCATGTCT"} |
2D Listから条件抽出(パラメータ外部指定)
AppleScript名:2D Listから条件抽出(パラメータ外部指定) |
— Created 2017-11-03 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property NSPredicate : a reference to current application’s NSPredicate property NSArray : a reference to current application’s NSArray set aList to {{"Apple", 2}, {"Lemon", 3}, {"Apple", 4}, {"Water Melon", 2}} set aTarg to {"Apple", 2} set anArray to NSArray’s arrayWithArray:aList set aPred to NSPredicate’s predicateWithFormat_("SELF[0] = %@ && SELF[1] >= %@", item 1 of aTarg, item 2 of aTarg) set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list –> {{"Apple", 2}, {"Apple", 4}} |
2D List中の特定アイテムが指定リストに入っていたら抽出
2D List(2次元配列)からの条件抽出です。
Predicates文で対象を指定できるので、表記は手軽だし簡潔に記述できるのですが、実行速度がいまひとつです。
AppleScriptの処理系はGUIアプリケーションとのプロセス間通信を行わないかぎりは、処理系が(いまとなっては)コンパクトなため相当に高速に処理してくれるので(大規模データの扱いに難はありますが)、AppleScriptの単純ループ処理で抽出したほうがCocoa呼び出しよりも高速というケースが多々あります。
数万件規模のデータになるとCocoaの機能を用いるべきですが、ごくごく小規模なデータを扱う(1万件以下)場合であれば、AppleScriptの単純ループ処理のほうが高速です。
Cocoaの呼び出し処理は初回に時間がかかって、繰り返し呼び出すことでキャッシュされてスピードが向上する傾向がありますが、このような小規模なデータが対象だとPlaneなAppleScriptの処理のほうが5倍以上高速という結果が出ます。
画像の空白検出のような大規模データの処理だとCocoaの機能を呼び出したほうが高速なので、そのあたりは使い分け・見極めがきわめて重要といえます。
AppleScript名:2D List中の特定アイテムが指定リストに入っていたら抽出 |
— Created 2017-11-03 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property NSPredicate : a reference to current application’s NSPredicate property NSArray : a reference to current application’s NSArray set aList to {{"Apple", 2}, {"Lemon", 3}, {"Apple", 4}, {"Water Melon", 2}} set aTarg to {"Apple", "Lemon"} –データの表記ゆらぎ対策に使える? set anArray to NSArray’s arrayWithArray:aList set aPred to NSPredicate’s predicateWithFormat_("SELF[0] IN %@", aTarg) set bRes to (anArray’s filteredArrayUsingPredicate:aPred) as list –> {{"Apple", 2}, {"Lemon", 3}, {"Apple", 4}} |
矩形座標同士の衝突判定 v3
AppleScript名:矩形座標同士の衝突判定 v3 |
— Created 2017-03-06 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set a1Rect to {origin:{x:10, y:10}, |size|:{width:100, height:100}} set b1Rect to {origin:{x:30, y:30}, |size|:{width:100, height:100}} set a1Res to detectRectanglesCollision(a1Rect, b1Rect) of me –> true set a4Rect to {origin:{x:0, y:20}, |size|:{width:100, height:10}} set b4Rect to {origin:{x:1000, y:10000}, |size|:{width:50, height:100}} set a2Res to detectRectanglesCollision(a4Rect, b4Rect) of me –> false set a3Rect to {origin:{x:30, y:30}, |size|:{width:50, height:50}} set b3Rect to {origin:{x:10, y:10}, |size|:{width:100, height:100}} set a3Res to detectRectanglesCollision(a3Rect, b3Rect) of me –> true set a4Rect to {origin:{x:0, y:20}, |size|:{width:100, height:10}} set b4Rect to {origin:{x:10, y:10}, |size|:{width:50, height:100}} set a4Res to detectRectanglesCollision(a4Rect, b4Rect) of me –> true –NSRect同士の衝突判定 on detectRectanglesCollision(aRect, bRect) set a1Res to current application’s NSIntersectionRect(aRect, bRect) return not (a1Res = {origin:{x:0.0, y:0.0}, |size|:{width:0.0, height:0.0}}) end detectRectanglesCollision |
矩形座標同士の合計
AppleScript名:矩形座標同士の合計 |
— Created 2017-03-06 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set a1Rect to {origin:{x:10, y:10}, |size|:{width:40, height:40}} set b1Rect to {origin:{x:30, y:30}, |size|:{width:40, height:40}} set a1Res to current application’s NSUnionRect(a1Rect, b1Rect) –> {origin:{x:10.0, y:10.0}, size:{width:60.0, height:60.0}} |
指定矩形内に含まれるデータをリストで返す v3
AppleScript名:指定矩形内に含まれるデータをリストで返す v3 |
— Created 2017-06-22 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aList to {{507, 162}, {338, 166}, {389, 166}, {448, 166}, {286, 110}, {504, 109}, {558, 108}, {341, 113}, {394, 115}, {447, 112}, {234, 107}, {611, 110}, {286, 58}, {501, 63}, {556, 58}, {337, 59}, {391, 60}, {448, 63}, {611, 58}} set rangeList to {{500, 100}, {550, 180}} –{{x1,y1}, {x2,y2}} set resList to withinRange(rangeList, aList) of me –> {{507, 162}, {504, 109}} on withinRange(rangeList as list, targetList as list) set aRect to makeNSRect(rangeList) of me set includedList to {} repeat with i in targetList copy i to {x, y} set aPoint to current application’s NSMakePoint(x, y) set aRes to (current application’s NSPointInRect(aPoint, aRect)) as boolean if aRes = true then set the end of includedList to contents of i end if end repeat return includedList end withinRange on makeNSRect(aList as list) try copy aList to {{x1, y1}, {x2, y2}} set xWidth to (x2 – x1) set yHeight to (y2 – y1) set a1Rect to {origin:{x:x1, y:y1}, |size|:{width:xWidth, height:yHeight}} return a1Rect on error return missing value end try end makeNSRect |
NSRectからの各種情報取得
AppleScript名:NSRectからの各種情報取得 |
use AppleScript version "2.4" use scripting additions use framework "Foundation" set aRect to current application’s NSMakeRect(0, 0, 100, 80) –> {origin:{x:0.0, y:0.0}, |size|:{width:100.0, height:80.0}} set aWidth to current application’s NSWidth(aRect) –> 100.0 set aHeight to current application’s NSHeight(aRect) –> 80.0 set aMinX to current application’s NSMinX(aRect) –> 0.0 set aMaxX to current application’s NSMaxX(aRect) –> 100.0 set aMidX to current application’s NSMidX(aRect) –> 50.0 set aMinY to current application’s NSMinY(aRect) –> 0.0 set aMaxY to current application’s NSMaxY(aRect) –> 80.0 set aMidY to current application’s NSMidY(aRect) –> 40.0 |
macOS 10.13以降は(何の説明もなく)NSMakeRectの返り値が変わっているので、注意が必要です。
use AppleScript version "2.4"
use scripting additions
use framework "Foundation"
set aRect to current application’s NSMakeRect(0, 0, 100, 80)
–> {origin:{x:0.0, y:0.0}, |size|:{width:100.0, height:80.0}}
–> {{0.0, 0.0}, {100.0, 80.0}}–macOS 10.13 or later
配列の要素数を取得する
Cocoaの配列の要素数を取得するAppleScriptです。
AppleScriptの配列であるリスト型変数については、length ofやcount ofで要素数を求められますが、
set aList to {1, 3, 5, 7, 9} length of aList --> 5 count of aList --> 5
Cocoaの配列であるNSArrayやNSMutableArrayについてはこのように求めます。
AppleScriptのリスト型変数には、GUIアプリケーションのオブジェクトやAppleScriptのScriptオブジェクトを格納することが可能ですが、Cocoaの配列であるNSArrayやNSMutableArrayにこれらを代入することはできません。
AppleScript名:配列の要素数を取得する |
— Created 2015-09-02 by Takaaki Naganoya — 2015 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set anArray to current application’s NSArray’s arrayWithObjects_(1, 2, 3) –> (NSArray) {1, 2, 3} –要素数を取得する set aSize to anArray’s |count|() –> 3 |
n次元のリストのすべてのアイテム数をカウント
n次元のリスト(配列)のすべてのアイテム数をカウントするAppleScriptです。
2次元でも3次元でも4次元でも、いかなる多次元配列のリストをも1次元配列に変換できるサブルーチン「FlattenList」はいまだに代替できるものが見当たらないほど万能で、この「要素数をカウントする」用途にも使ってみました。
AppleScript名:n次元のリストのすべてのアイテム数をカウント |
— Created 2017-10-30 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aList to {{1, 2, 3}, {4, 5, 6}, {7, 8, 9, {1, 2, 3}}} set aRes to FlattenList(aList) of me set aLen to length of aRes on FlattenList(aList) set oldDelims to AppleScript’s text item delimiters set AppleScript’s text item delimiters to {"????"} set aString to aList as text set aList to text items of aString set AppleScript’s text item delimiters to oldDelims return aList end FlattenList |
リスト項目のシャッフル(ASOC)
AppleScript名:リスト項目のシャッフル(ASOC) |
— Created 2016-12-06 by Takaaki Naganoya — 2016 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" use framework "ArrayRandomize" –https://github.com/masakihirokawa/objc-classes-dc-randomize –http://piyocast.com/as/archives/4351 –配列をシャッフルして取得 set anArray to current application’s NSMutableArray’s alloc()’s initWithArray:{1, 2, 3, 4, 5} set bArray to (current application’s DCRandomize’s shuffleArray:anArray) as list –> {5, 3, 1, 2, 4} –1〜10の数値をシャッフルして配列取得 set cArray to (current application’s DCRandomize’s shuffle:1 max:10) as list –> {9, 4, 6, 5, 3, 2, 7, 8, 1, 10} –5〜10の範囲の乱数を取得 set dArray to (current application’s DCRandomize’s range:5 max:10) as integer –> 7 –5〜10の範囲で 9以外の乱数を取得 set eArray to (current application’s DCRandomize’s exact:5 max:10 exceptId:9) –> 9 |
GameplayKitを使ったリストのシャッフル
AppleScript名:GameplayKitを使ったリストのシャッフル |
— Created 2016-12-08 by Shane Stanley use AppleScript version "2.5" use framework "Foundation" use framework "GameplayKit" use scripting additions set anArray to current application’s NSArray’s arrayWithArray:{1, 2, 3, 4, 5, 6, 7, 8, 9, 10} set newArray to anArray’s shuffledArray() as list — requires macOS 10.12 |
和集合(union)v2
AppleScript名:和集合(union)v2 |
— Created 2017-02-24 by Takaaki Naganoya — Created 2017-03-01 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4491 set aSet to current application’s NSMutableSet’s setWithArray:{1, 2, 3, 4} set bSet to current application’s NSMutableSet’s setWithArray:{3, 5, 6, 7} aSet’s unionSet:bSet –和集合 aSet’s allObjects() as list –> {5, 1, 6, 2, 7, 3, 4} |
補集合(set difference)v2
AppleScript名:補集合(set difference)v2 |
— Created 2017-02-24 by Takaaki Naganoya — Created 2017-03-01 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4491 set aSet to current application’s NSMutableSet’s setWithArray:{1, 2, 3, 4} set bSet to current application’s NSMutableSet’s setWithArray:{3, 5, 6, 7} aSet’s minusSet:bSet –補集合 aSet’s allObjects() as list –> {2, 1, 4} |
積集合(product)v2
AppleScript名:積集合(product)v2 |
— Created 2017-02-24 by Takaaki Naganoya — Created 2017-03-01 by Shane Stanley use AppleScript version "2.4" use scripting additions use framework "Foundation" –http://piyocast.com/as/archives/4491 set aSet to current application’s NSMutableSet’s setWithArray:{1, 2, 3, 4} set bSet to current application’s NSMutableSet’s setWithArray:{3, 5, 6, 7} aSet’s intersectSet:bSet –積集合 aSet’s allObjects() as list –> {3} |
文字を集合(CountedSet)に変換して文字列同士の近似度を計算する(単語単位で評価) v4
AppleScript名:文字を集合(CountedSet)に変換して文字列同士の近似度を計算する(単語単位で評価) v4 |
— Created 2017-03-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aStr to "This is a pinnapple." set bStr to "This is an apple." set cStr to "Piyomaru San Dayo." set aRes to stringDifferenceWithAppearance(aStr, bStr, "A & B") of me –> {intersect:2, minus:2, dataLabel:"A & B"} set bRes to stringDifferenceWithAppearance(bStr, cStr, "B & C") of me –> {intersect:0, minus:4, dataLabel:"B & C"} set cRes to stringDifferenceWithAppearance(cStr, aStr, "C & A") of me –> {intersect:0, minus:3, dataLabel:"C & A"} –結果をソートする set allRes to current application’s NSArray’s arrayWithArray:{aRes, bRes, cRes} set aSortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:"intersect" ascending:false set bSortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:"minus" ascending:true set aSortedArray to allRes’s sortedArrayUsingDescriptors:{aSortDesc, bSortDesc} –もっとも似ている傾向を持つデータの組み合わせ set aMostApproximative to aSortedArray’s firstObject() as record –> {minus:2, dataLabel:"A & B", intersect:2} –文字列同士の近似傾向を、相違点と重複箇所の2つの方向から計算する on stringDifferenceWithAppearance(aStr, bStr, aLabel) set aMinus to getApproximationBetweenStrings(aStr, bStr) of me set aIntersect to getApproximationBetweenStringsIntersect(aStr, bStr) of me return {intersect:aIntersect, minus:aMinus, dataLabel:aLabel} end stringDifferenceWithAppearance –与えられた文字列同士の相違点を計算する(結果がより小さい値のデータ同士が似ている) on getApproximationBetweenStrings(aStr, bStr) set aList to current application’s NSMutableArray’s arrayWithArray:(words of aStr) set bList to current application’s NSMutableArray’s arrayWithArray:(words of bStr) set aIndex to current application’s NSCountedSet’s alloc()’s initWithArray:aList set bIndex to current application’s NSCountedSet’s alloc()’s initWithArray:bList aIndex’s minusSet:bIndex set aRes to aIndex’s allObjects()’s |count|() bIndex’s minusSet:aIndex set bRes to bIndex’s allObjects()’s |count|() if aRes ≥ bRes then return bRes else return aRes end if end getApproximationBetweenStrings –与えられた文字列同士の重複箇所を計算する(結果がより大きい値のデータ同士が似ている) on getApproximationBetweenStringsIntersect(aStr, bStr) set aList to current application’s NSMutableArray’s arrayWithArray:(words of aStr) set bList to current application’s NSMutableArray’s arrayWithArray:(words of bStr) set aIndex to current application’s NSCountedSet’s alloc()’s initWithArray:aList set bIndex to current application’s NSCountedSet’s alloc()’s initWithArray:bList aIndex’s intersectSet:bIndex set aRes to aIndex’s allObjects()’s |count|() return aRes end getApproximationBetweenStringsIntersect |
文字を集合(CountedSet)に変換して文字列同士の近似度を計算する v3
AppleScript名:文字を集合(CountedSet)に変換して文字列同士の近似度を計算する v3 |
— Created 2017-03-18 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" set aStr to "This is a pinnapple." set bStr to "This is an apple." set cStr to "Piyomaru San Dayo." set aRes to stringDifferenceWithAppearance(aStr, bStr, "A & B") of me –> {intersect:11, minus:3} set bRes to stringDifferenceWithAppearance(bStr, cStr, "B & C") of me –> {intersect:5, minus:8} set cRes to stringDifferenceWithAppearance(cStr, aStr, "C & A") of me –> {intersect:5, minus:9} –結果をソートする set allRes to current application’s NSArray’s arrayWithArray:{aRes, bRes, cRes} set aSortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:"intersect" ascending:false set bSortDesc to current application’s NSSortDescriptor’s alloc()’s initWithKey:"minus" ascending:true set aSortedArray to allRes’s sortedArrayUsingDescriptors:{aSortDesc, bSortDesc} –もっとも似ている傾向を持つデータの組み合わせ set aMostApproximative to aSortedArray’s firstObject() as record –> {minus:3, dataLabel:"A & B", intersect:11} –文字列同士の近似傾向を、相違点と重複箇所の2つの方向から計算する on stringDifferenceWithAppearance(aStr, bStr, aLabel) set aMinus to getApproximationBetweenStrings(aStr, bStr) of me set aIntersect to getApproximationBetweenStringsIntersect(aStr, bStr) of me return {intersect:aIntersect, minus:aMinus, dataLabel:aLabel} end stringDifferenceWithAppearance –与えられた文字列同士の相違点を計算する(結果がより小さい値のデータ同士が似ている) on getApproximationBetweenStrings(aStr, bStr) set aList to current application’s NSMutableArray’s arrayWithArray:(characters of aStr) set bList to current application’s NSMutableArray’s arrayWithArray:(characters of bStr) set aIndex to current application’s NSCountedSet’s alloc()’s initWithArray:aList set bIndex to current application’s NSCountedSet’s alloc()’s initWithArray:bList aIndex’s minusSet:bIndex set aRes to aIndex’s allObjects()’s |count|() bIndex’s minusSet:aIndex set bRes to bIndex’s allObjects()’s |count|() if aRes ≥ bRes then return bRes else return aRes end if end getApproximationBetweenStrings –与えられた文字列同士の重複箇所を計算する(結果がより大きい値のデータ同士が似ている) on getApproximationBetweenStringsIntersect(aStr, bStr) set aList to current application’s NSMutableArray’s arrayWithArray:(characters of aStr) set bList to current application’s NSMutableArray’s arrayWithArray:(characters of bStr) set aIndex to current application’s NSCountedSet’s alloc()’s initWithArray:aList set bIndex to current application’s NSCountedSet’s alloc()’s initWithArray:bList aIndex’s intersectSet:bIndex set aRes to aIndex’s allObjects()’s |count|() return aRes end getApproximationBetweenStringsIntersect |
配列から要素を削除する(要素をインデックスで指定)
AppleScript名:配列から要素を削除する(要素をインデックスで指定) |
— Created 2017-02-24 11:37:14 +0900 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –要素を削除する(要素をインデックスで指定) set cMuta to current application’s NSMutableArray’s arrayWithObjects_(1, 2, 3) cMuta’s removeObjectAtIndex:2 cMuta –> (NSArray) {1, 2} |
配列の要素を削除する(範囲を指定)
AppleScript名:配列の要素を削除する(範囲を指定) |
— Created 2017-02-24 11:37:55 +0900 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –要素を削除する(範囲を指定) set dMuta to current application’s NSMutableArray’s arrayWithObjects_(1, 2, 3) dMuta’s removeObjectsInRange:(current application’s NSMakeRange(0, 1)) dMuta –> (NSArray) {2, 3} |
配列の要素をすべて削除する
AppleScript名:配列の要素をすべて削除する |
— Created 2017-02-24 11:38:17 +0900 by Takaaki Naganoya — 2017 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –要素をすべて削除する set eMuta to current application’s NSMutableArray’s arrayWithObjects_(1, 2, 3) eMuta’s removeAllObjects() eMuta –> (NSArray) {} |