【Applescript】どうやったらリストから改行テキストが作れるの? [AppleScript辞書はつくれるか?]
いろいろな形式の変換があります。
(* 数字(number)から、テキスト(text)へ *)
set |数字| to 123
|数字| as text --(as string でも同じ)
--> "123"
(* いろいろな数字表記のテキスト(text)から、数字(number)へ *)
set |テキスト| to "123" --半角数字
|テキスト| as number
--> 123
set |テキスト| to "123" --全角数字
|テキスト| as number
--> 123
set |テキスト| to "一二三" --全角和数字はつかえる?
|テキスト| as number
--> error ("一二三" のタイプを number に変換できません。)
set |テキスト| to "1 + 2 + 3" --計算できる?
|テキスト| as number
--> error ("1 + 2 + 3" のタイプを number に変換できません。")
(* テキスト(text)から、一文字ごとに分離(list)へ *)
set |テキスト| to "123,456 3.14は円周率"
every character of |テキスト| --(every item でも同じ)
--> {"1", "2", "3", ",", "4", "5", "6", " ", "3", ".", "1", "4", "は", "円", "周", "率"}
(* テキスト(text)から、単語ごとに分離(list)へ *)
set |テキスト| to "123,456 3.14は円周率"
every word of |テキスト|
--> {"123,456", "3.14", "は", "円周", "率"} --日本語ではうまく分離できてない
(* 複数行のテキスト(text)から、行ごとに分離へ *)
"123456789
あいうえお
漢字
2015/2/4"
set theData to result
every paragraph of theData
--> {"123456789", "あいうえお", "漢字", "2015/2/4"}
(* リスト(list)から、テキスト(text)へ *)
set |リスト| to {"文字", 123, (date "12:00")}
|リスト| as text
--> "文字1232015年2月4日水曜日 12:00:00"
『テキストを数字に』やその逆とか。また、テキストをリストに替える。
ここまでわかるのです。
では、リストからテキストに変更するには、どうしたら良いのでしょう?
(* リスト(list)から、テキスト(text)へ *)
set |リスト| to {123, "文字", (date "1999年12月29日水曜日 12:00:00")}
|リスト| as text
--> "123文字1999年12月29日水曜日 12:00:00"
まぁ、これもできます。全てのリストの要素が、1行にテキスト化されるわけですね。
問題はこの先です。
では、リストを、要素ごとに改行されたテキストにするには?
これについては、簡単に変換できる物が見つかりません。
あるんですかね?
仕方が無いので、次のように順序よくつなげていくしかないのでしょうか?
set |リスト| to {123, "文字", (date "1999年12月29日水曜日 12:00:00")}
set |テキスト| to ""
repeat with oneItem in |リスト|
set |改行済みテキスト| to |テキスト| & oneItem & return
end repeat
-->
"123
文字
1999年12月29日水曜日 12:00:00
"
これでも、良いと思いますが、このやり方には弱点があるのです。
リストの数が千とか万とかの大量にある場合に大変時間がかかります。
それは、スクリプトを見てわかると思いますが、どんどん|テキスト|が肥大化していってしまい、
回数を追うごとに、処理に負担がかかり遅くなります。
どうしたら良いでしょう? と考えるならば、
個別のアイテムごとに改行を加えてから、一括でテキスト化する方が早いと思います。
set |リスト| to {123, "文字", (date "1999年12月29日水曜日 12:00:00")}
repeat with i from 1 to (count of |リスト|)
set item i of |リスト| to (item i of |リスト|) & return
end repeat
set |改行済みテキスト| to |リスト| as text
上記例のようなアイテム数が少ないものでしたら、どちらでも大差ないのですが、一つ一つのアイテムの文字数が多いく、アイテム数が膨大なデータベースを扱う場合は下記の方が早いようです。
下記のスクリプトは、そのテスト例です。
(* テキストデータのリストを1000以上ストックします。 *)
set theData to {}
repeat 10000 times
set theData to theData & {"何でも良いので適当にデータを作成。長い文章を作ろうと思っても何も思い浮かばないのでグダグダにしています。"}
end repeat
(* A.逐次データを足していく方法 *)
set time1 to EPOCTimeGetter() --始める現在時間を計測
set Data1 to ""
repeat with oneItem in theData
set Data1 to Data1 & oneItem & return
end repeat
set time1 to (EPOCTimeGetter()) - time1 --|現在時間|から|始めた時間|を差し引いて、経過時間を取得
(* B.個別に改行処理をしてから一つに集合する方法 *)
set time2 to EPOCTimeGetter() --始める現在時間を計測
repeat with i from 1 to (count of theData)
set item i of theData to (item i of theData) & return
end repeat
set Data2 to theData as text
set time2 to (EPOCTimeGetter()) - time2 -- 経過時間を取得
{A:time1, B:time2}
on EPOCTimeGetter() --ミリ秒計測
set theTime to (do shell script "perl -e 'use Time::HiRes qw(gettimeofday); my($sec,$microsec)=gettimeofday(); print $sec,\".\",$microsec . \"
\";'")
set theTime to theTime as number
return theTime
end EPOCTimeGetter
(* ミリ秒計測は http://office-dd.jimdo.com/2012/11/22/applescript-memo-chapter-02/ よりお借りしました*)
各アイテムの文字数は52文字で、アイテム数を10000個としました。
動作にばらつきがあるので5回計測しました。その結果は
--{A:17.1864798069, B:6.974973917007}
--{A:18.272110939026, B:7.020260095596}
--{A:16.510037183762, B:6.942340135574}
--{A:18.384201049805, B:7.025103092194}
--{A:18.124442100525, B:7.049201011658}
最初のスクリプトでは、18秒くらい。
後のスクリプトでは、7秒程度の処理でした。
あくまでも、AppleScriptで処理したい気持ちで作りましたが、
do shell scriptを使えばもっと早いやり方があるんだろうなぁ・・・。
use scripting additions
use framework "Foundation"
set a1Dat to current application's NSDate's timeIntervalSinceReferenceDate()
(* なんらかの処理 *)
set a2Dat to current application's NSDate's timeIntervalSinceReferenceDate()
log ("sec: " & (text 1 thru 5 of (((a2Dat - a1Dat) as string) & " ")))
set textItem to {"我輩は", "猫のように", "寝て暮らしたい"}
set defaultDelimit to AppleScript's text item delimiters
set AppleScript's text item delimiters to ASCII character (13)
set textItem to textItem as text
set AppleScript's text item delimiters to defaultDelimit
textItem
結果:
"我輩は
猫のように
寝て暮らしたい"
コメント 0