それほど長くない文字列の空白文字列クリーニングを行うAppleScriptです。
" First model, with mechanical scroll wheel. 10 GB model released later ."
のようなデータを、
"First model, with mechanical scroll wheel. 10 GB model released later ."
のようにクリーニングします。
フィールド文字列のクリーニング用なので、だいたい256バイト以内。長くても1024バイト程度のデータを想定しています。
とくに、データが長くなった場合に備えての高速化対応処理はしていませんが、それでもCocoaの正規表現系の機能を使った実装よりもだいたい5倍ぐらいは高速です。
画像処理ぐらいのデータ量があるとCocoa系の機能を使ったほうがはるかに高速ですが、この手の小ぶりなデータの処理にはNativeなAppleScriptの処理を行ったほうが高速です。
文字列の先頭と末尾に入っている無駄なスペース(空白文字)を除去し、文字列本体中に入っている「2つ以上連続して存在するスペース」についても除去します。
AppleScript名:前後に存在するスペースと、文字列中に存在する2個以上の連続するスペースを削除して返す.scpt |
— Created 2020-09-27 by Takaaki Naganoya — 2020 Piyomaru Software use AppleScript version "2.4" use scripting additions use framework "Foundation" –指定文字列の前後に存在するスペースと、文字列本体中に存在する2個以上の連続するスペースを削除して返す set a0Str to " First model, with mechanical scroll wheel. 10 GB model released later ." set aRes to removeWhiteSpaceRepeatation(a0Str, " ") of me –> "First model, with mechanical scroll wheel. 10 GB model released later ." –クリーニング対象文字(たぶんスペース)が処理対象文字列の前後にあったり、途中に2つ以上連続して存在している場合には削除 on removeWhiteSpaceRepeatation(a0Str as string, aChar as string) if length of aChar is not equal to 1 then return false set a1Str to trimFromHeadAndTail(a0Str, aChar) of me –> "First model, with mechanical scroll wheel. 10 GB model released later ." set sucList to detectSuccsessionOfSpace(a1Str, aChar) of me –> {{43, 53}, {80, 108}} if sucList = {} then return a1Str set allRes to removeRepeatedSpaceChar(a1Str, sucList) return allRes end removeWhiteSpaceRepeatation –同一文字(スペース)の連続出現リスト({{start pos 1, end pos 1}, {start pos 2, end pos 2}……})をもとにテキストを切り抜く on removeRepeatedSpaceChar(a1Str as string, sucList as list) set aList to characters of a1Str set aLen to length of aList set outStr to "" set aCount to 1 copy contents of item aCount of sucList to {sItem, eItem} repeat with i in sucList copy i to {tmpS, tmpE} if aCount = tmpS then –Skip copy tmpE to aCount else set tmpStr to text (aCount) thru tmpS of a1Str set outStr to outStr & tmpStr copy tmpE to aCount end if end repeat if tmpE < aLen then set tmpStr to text (tmpE + 1) thru -1 of a1Str set outStr to outStr & tmpStr end if return outStr end removeRepeatedSpaceChar –対象文字列で、2個以上同一文字(スペースを想定)が連続して存在する場合には削除する on detectSuccsessionOfSpace(a1Str as string, sucTargChar as string) set aList to characters of a1Str set aLen to length of aList set newList to {} set tmpS to 0 set tmpE to 0 set spcF to false –false:spaceではない。true:spaceをみつけた set spcCount to 0 repeat with i from 1 to aLen set j to contents of item i of aList if j = sucTargChar then –Space 1 char (must be a char) if spcF = true then –スペースが連続している最中 set spcCount to spcCount + 1 else –スペースの連続部分(?)の先頭をフェッチした状態 set spcF to true set spcCount to 1 copy i to tmpS end if else –連続スペースの末端部分 if spcF = true then copy i to tmpE if spcCount > 1 then set the end of newList to {tmpS, tmpE – 1} end if set spcCount to 0 set spcF to false else –何もしない end if end if end repeat return newList end detectSuccsessionOfSpace –文字列の先頭と末尾から連続するスペースを検索して削除する on trimFromHeadAndTail(aStr as string, trimChar as string) set aLen to length of aStr set aList to characters of aStr –Find not target character from head to tail set aCount to 1 repeat with i in aList set j to contents of i if j is not equal to trimChar then exit repeat end if set aCount to aCount + 1 end repeat if aLen ≤ aCount then return "" –Find not target character from tail to head set bCount to 1 repeat with ii in (reverse of aList) set jj to contents of ii if jj is not equal to trimChar then exit repeat end if set bCount to bCount + 1 end repeat set resStr to text aCount thru (aLen – bCount + 1) of aStr return resStr end trimFromHeadAndTail –Written By Philip Aker –文字置換ルーチン on repChar(origText as string, targStr as string, repStr as string) set {txdl, AppleScript’s text item delimiters} to {AppleScript’s text item delimiters, targStr} set temp to text items of origText set AppleScript’s text item delimiters to repStr set res to temp as text set AppleScript’s text item delimiters to txdl return res end repChar |
More from my site
(Visited 99 times, 1 visits today)