CotEditorで編集中の最前面の書類の本文中から指定桁の数値を抽出して登場回数で度数分布の集計を行うAppleScriptです。
CotEditorのアプリケーション内のスクリプトメニューに入れて実行できることを確認してあります(@macOS 10.14.5)。
たまたま、テキストで集計していた情報のうち、数値部分の度数分布を計算したいと考え、ありもののルーチンを組み合わせて作ったものです。
実行すると、集計対象の数値の桁数を聞いてくるため、適当なものを選択してださい。
CotEditorのScriptingの要注意点で、オブジェクト階層を素直に書いて、当該階層のオブジェクトの属性値を取りたいような場合に、そのまま属性を書いても取得できないケースが見られます。そのため、明示的にオブジェクト階層を指定するために「of it」を書いています。Xcodeが同じような挙動を行うため、注意が必要です。
本Scriptについていえば、正規表現でテキストから情報を抽出したりと、一応最低限のレベルはクリアしているものの、いまひとつ満足できません。
数字が連続して登場している箇所を抽出し、どれを集計対象にするのかといった分析を冒頭で行ってユーザーに問い合わせしたいところです。現段階では、「桁数を聞く」という頭の悪い実装になっていますが、そのうちどうにかしたいと考えるところです。
AppleScript名:テキストから指定桁数の数値を抽出して度数分布集計.scptd |
— Created 2019-06-28 by Takaaki Naganoya — 2019 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" property graphStr : "絆" –グラフに出力する文字 tell application "CotEditor" –最前面の書類からテキスト本文を取得 tell front document set aText to contents of it –本文 set lineTerm to (line ending) –改行コード end tell –改行コードの選択(ドキュメントの状態から取得) if lineTerm = LF then set aRet to ASCII character 10 –To avoid keyword conflict (string) else if lineTerm = CR then set aRet to ASCII character 13 else if lineTerm = CRLF then set aRet to (ASCII character 13) & (ASCII character 10) else set aRet to ASCII character 10 end if end tell –桁数選択 set digiList to {"2", "3", "4", "5"} set digitRes to first item of (choose from list digiList with prompt "Choose the digit to extract as numbers") –正規表現で数字部分のみ抽出 set theList to my findPattern:("[0-9]{" & digitRes & "}") inString:aText –検出した数字部分の度数分布を計算 set theCountedSet to current application’s NSCountedSet’s alloc()’s initWithArray:theList set newArray to current application’s NSMutableArray’s new() set kList to uniquifyAndSort1DList(theList, false) of me –降順ソート repeat with i in kList (newArray’s addObject:{theKey:i, theCount:(theCountedSet’s countForObject:i)}) end repeat –出力用のテキストを作成 set outStr to "" repeat with i in newArray as list set outStr to (outStr & (theKey of i) as string) & ":" set aNum to (theCount of i) as integer repeat aNum times set outStr to outStr & graphStr end repeat set outStr to outStr & aRet end repeat –最前面のテキスト末尾に集計結果を出力 tell application "CotEditor" tell front document set contents of it to (aText & aRet & aRet & "集計結果:" & aRet & aRet & outStr & aRet) end tell end tell –正規表現でテキスト中から指定パターンに該当する箇所を抽出してリストで返す on findPattern:thePattern inString:theString set theOptions to ((current application’s NSRegularExpressionDotMatchesLineSeparators) as integer) + ((current application’s NSRegularExpressionAnchorsMatchLines) as integer) set theRegEx to current application’s NSRegularExpression’s regularExpressionWithPattern:thePattern options:theOptions |error|:(missing value) set theFinds to theRegEx’s matchesInString:theString options:0 range:{location:0, |length|:length of theString} set theFinds to theFinds as list — so we can loop through set theResult to {} — we will add to this set theNSString to current application’s NSString’s stringWithString:theString repeat with i from 1 to count of items of theFinds set theRange to (item i of theFinds)’s range() set end of theResult to (theNSString’s substringWithRange:theRange) as integer end repeat return theResult end findPattern:inString: –1D Listをユニーク化してソート on uniquifyAndSort1DList(theList as list, aBool as boolean) set aArray to current application’s NSArray’s arrayWithArray:theList set bArray to aArray’s valueForKeyPath:"@distinctUnionOfObjects.self" set aDdesc to current application’s NSSortDescriptor’s sortDescriptorWithKey:"self" ascending:aBool selector:"compare:" set cArray to bArray’s sortedArrayUsingDescriptors:{aDdesc} set bList to cArray as list return bList end uniquifyAndSort1DList |