文字列 “Jaga, imo, LISP” から リスト (“Jaga” “imo” “LISP”) を作成します。
予備知識
リストって何?という方はまずはコチラの記事を。
文字列から一文字づつ取り出してリストにする方法。
今回は “,” で区切られた所までを一つづつ取り出してリストにします。
関数 vl-string-search
文字列の中に引数で渡した文字が何番目にあるのか調べる関数です。
文字列からリストに作成
文字列 “Jaga,imo,LISP”から , で区切られた単語1つづつ取り出してリストにしていきます。
まずはコマンドラインに入力しながら、一つ一つ動きを見ていきましょう。
setq で変数 Tx に 文字列 “Jaga,imo,LISP” を代入します。
(setq Tx "Jaga,imo,LISP")
関数 vl-string-search を使って、, の位置を得ます。
4が戻り値になり、変数 Numに代入します。
(setq Num (vl-string-search "," Tx))
この”JagaimoLISP” から最初の , までの”Jaga”だけを得るには、関数 substr を使います。
substr の引数は開始位置と最終位置です。
この場合、開始位置は 1 最終位置は先ほど 変数Num に入れた値です。
vl-string-search は 1文字目が0です。
substr は1文字目が1です。
なので、vl-string-searchで得た , の位置をそのまま使えば、, の手前までになります。
(substr TX 1 Num)
これで”Jaga” が戻り値になります。
この文字列を 関数 cons を使ってリストに足します。ここで使うリストは 変数 Lst に代入します。
関数 cons に必要な引数は足したい要素とリスト です。
要素は先ほどの (substr TX 1 Num)、リストは 変数 Lst です。
最初の文字を足す時には、変数 Lstは何も入っていない nil ですが、nilの場合はリストが作成されます。
(setq Lst (cons (substr TX 1 Num) Lst))
これで、(“Jaga”) というリストが 変数 Lst に代入されました。
変数の値を確認したい場合、コマンドラインに !Lst と入力すれば確認できます。
!Lst
最初の , までの文字列をリストに入れることができたので、Txに入れた文字列から消します。
関数 substr は最終位置を省略すると最後までになります。
開始位置を、Numに入れた値 + 2 にすると、, の次の文字なります。
そして、最終位置省略し、, の次の文字から最後までの文字列が戻り値になります。
(setq Tx (substr Tx (+ Num 2)))
これで、変数 Tx に代入された文字列が “imo,LISP” になりました。
この流れを繰り返すことで、コンマで区切られた文字を一つづつリストに加えることができます。
繰り返すのに while を使い、(while (setq Num (vl-string-search “,” Tx)) で、, が文字列にあるまで繰り返しています。
最後の “,” が消えた後、1単語残るので、while 繰り返しを抜けた後に(setq Lst (cons Tx Lst))で最後の1単語を足します。
この方法で文字列を足していくと、最初に入れた要素がリストの最後になり
(“LISP” “imo” “Jaga”)
というリストになってしまうので、関数 reverse を使って最後に順番を逆にします。
AutoLISPプログラム
上記の流れを一つのコマンドにまとめました。
コマンド名はtest。
文字列を分けてにしてリスト作成する例のためだけのコマンドなので、単に
(“Jaga” “imo” “LISP”)
とコマンドラインに出てくるだけです。
(defun c:test ( / Tx Num Lst)
(setq Tx "Jaga,imo,LISP")
(while (setq Num (vl-string-search "," Tx))
(setq Lst (cons (substr TX 1 Num) Lst))
(setq Tx (substr Tx (+ Num 2)))
);while
(setq Lst (cons Tx Lst))
(setq Lst (reverse Lst))
);defun
まとめ
- 関数 substrで文字列を部分的にして、関数consでリストに足していくことで、文字列をバラバラにしたリストを作成できる。
関連記事
コンマ区切りの文字列をリストにした活用例です。
CSV は コンマ 区切りで読み込まれるのでそれをリストに変換して使っています。
サンプルでは循環させて違う書き方をしていますが動きは同じです。
Comments