SSブログ

【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

--> "文字123201524日水曜日 12:00:00"



『テキストを数字に』やその逆とか。また、テキストをリストに替える。

ここまでわかるのです。

では、リストからテキストに変更するには、どうしたら良いのでしょう?


(* リスト(list)から、テキスト(text)へ *)

set |リスト| to {123, "文字", (date "19991229日水曜日 12:00:00")}

|リスト| as text

--> "123文字19991229日水曜日 12:00:00"


まぁ、これもできます。全てのリストの要素が、1行にテキスト化されるわけですね。

問題はこの先です。

では、リストを、要素ごとに改行されたテキストにするには?

これについては、簡単に変換できる物が見つかりません。

あるんですかね?


仕方が無いので、次のように順序よくつなげていくしかないのでしょうか?


set |リスト| to {123, "文字", (date "19991229日水曜日 12:00:00")}

set |テキスト| to ""

repeat with oneItem in |リスト|

set |改行済みテキスト| to |テキスト| & oneItem & return

end repeat

-->

"123

文字

19991229日水曜日 12:00:00

"


これでも、良いと思いますが、このやり方には弱点があるのです。

リストの数が千とか万とかの大量にある場合に大変時間がかかります。

それは、スクリプトを見てわかると思いますが、どんどん|テキスト|が肥大化していってしまい、

回数を追うごとに、処理に負担がかかり遅くなります。


どうしたら良いでしょう? と考えるならば、

個別のアイテムごとに改行を加えてから、一括でテキスト化する方が早いと思います。


set |リスト| to {123, "文字", (date "19991229日水曜日 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/ よりお借りしました*)

(* ちなみにこのミリ秒計測には2つの致命的なバグがあり不正確だとわかりました。だいたいでよければ・・・ *)

各アイテムの文字数は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を使えばもっと早いやり方があるんだろうなぁ・・・。

今後の課題です。

--こうゆうのもあった(2017/11/14)

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) & "    ")))

--これならマイクロ秒まで測れる(Applescriptなので正確かはわからない)



 

(追記)
高速でリストのアイテムごとに改行する方法がありました。

 


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

 


結果:

"我輩は

猫のように

寝て暮らしたい"



nice!(0)  コメント(0)  トラックバック(0) 
共通テーマ:パソコン・インターネット

nice! 0

コメント 0

コメントを書く

お名前:
URL:
コメント:
画像認証:
下の画像に表示されている文字を入力してください。

トラックバック 0

この広告は前回の更新から一定期間経過したブログに表示されています。更新すると自動で解除されます。