Sponsored links

【AutoLISP データ読み込み】関数 open, close, read-line

Sponsored links
open signage mounted on white wall AutoLISP
Photo by Arnie Chou on Pexels.com
Sponsored links

テキスト形式の情報を読み込む方法です。CSV形式のファイルも同じように読み込めます。

テキストファイル(拡張子 .txt)にある文字を読み込む方法です。

Sponsored links

関数 open

関数 open は情報を読み込むためにファイルを開く関数です。関数 close とセットで使います。

openの引数

引数は、開くファイルのファイルパスモードです。

モードは読み込み(“r”)、書き出し(“w”)、追加(“a”) の3種類あります。
この記事ではは読み込みモードを使って読み込む方法を説明します。

openの戻り値

戻り値は開いたファイルを識別するためのファイルディスクリプタです。

指定したファイルが開かなかった場合は nil が戻ります。

ファイルの内容の読み込み、閉じるときに必要になるので
(setq 変数 (open “パス” “モード”))
と開いたついでに戻り値を変数に代入するのが一般的です。

Jagaimo
Jagaimo

openで開いた後、closeで閉じずにいると、AutoCADでデータファイルを開いたままになります。
そのデータファイルの削除、編集、名称変更などしたくても、

「別のプログラムがこのフォルダーまたはファイルを開いているので操作を完了できません」
とエラーメッセージが出てきてできません。

関数 read-line

関数 read-line は open で開いたファイルを一行づつ読み込んでいく関数です。

read-line の引数

引数はopenでファイルを開いたときの戻り値 ファイルディスクリプタです。

read-line の戻り値

戻り値はファイルから読み込んだ値です。
数字の場合も文字列として読み込まれます。

文字列と数値の違いについてはこちらの記事を参考にしてください。

関数 close

関数 close はopenで開いたファイルを使い終わったら閉じる関数です。

close の引数

引数はファイルを開いたときの戻り値ファイルディスクリプタです。

close の戻り値

nil が戻ります。
引数が無いなど何らかの理由で閉じる操作がうまく閉じなかった場合はエラーメッセージが出ます。

テキストを読み込んでみよう

実際にテキストファイルを用意して、コマンドラインに入力しながら読み込んでいきましょう。

テキストファイルの準備

メモ帳で文字が入ったテキストファイルを用意してください。
今回は一行だけ読み込みます。

ファイルのパス

読み込むためにはファイルのパスが必要です。

CドライブのJagaimoLISPというフォルダに DATA.txt という名前で保存した場合は

C:/JagaimoLisp/DATA.txt
もしくは
C:\\JagaimoLisp\\DATA.txt

です。

フォルダを開いてパスのコピーでフルパスを取得すると、
C:\JagaimoLisp\DATA.txt
というように、区切りが \ になると思いますが、AutoLISPではこのままでは読み込めません。

区切りを /もしくは \\ に変更してください

C:/JagaimoLisp/DATA.txt
C:\\JagaimoLisp\\DATA.txt

× C:\JagaimoLisp\DATA.txt
× C://JagaimoLisp//DATA.txt

open で開く

それでは、コマンドラインに入力しながら関数の動きを見ていきましょう。

コマンドラインがAutoCADにありませんか?

CTRL+9 はコマンドライン表示/非表示のショートカットです。

もしくは、commandline はコマンドラインを表示させるコマンドです。

まず、関数 open を使って開きます。
setq を使って、戻り値を変数 FileIDに代入しておきます。

コマンドラインに下記の通り入力してください。
入力後、エンターキーで実行です。

(setq FileID (open "C:/JagaimoLisp/DATA.txt" "r"))

#<file “C:/JagaimoLisp/DATA.txt”> という戻り値がファイルを識別するためのファイルディスクリプタです。これが出てきたら無事にファイルが開きました。
変数 FIleIDに値が入ったかどうか調べたい場合は、

!FIleID

とコマンドラインに入力すると変数 FileIDの中の値を確認できます。

read-line で読み込む

無事にファイルが開いたら (read-line FileID) で読み込みます。
わかりやすいように 関数 alert を使って読み込んだ文字列をメッセージボックスで表示してみましょう。

(alert (read-line FileID))

無事に読み込み成功した場合、メッセージボックスが現れます。

close で閉じる

使い終わったら (close FileID) でファイルを閉じます。

(close FileID)

自作コマンド内で読み込む

上記の例をまとめてコマンド例にしました。

コマンドの内容は「指定したファイルから1行読み込んでメッセージボックスを出す。」
コマンド名は 「test」 です。

(defun c:test (/ FileID)
  
  (if (setq FileID (open "H:/JagaimoLisp/DATA.txt" "r")) ;ファイルを読み込みモードで開く
    
    (progn   ;もしファイルが開いたら
      (alert (read-line FileID)) ;1行目を読み込んでメッセージボックス表示
      (close FileID);ファイルを閉じる
     );progn
    
    (alert "ファイルを正常に開けませんでした") ;開けなかったら場合はこのメッセージを出す
  
  );if
  
(princ));defun

if ファイルを読み込めなかった場合に備えて

関数 if を入れ、開けた場合とそうでなかった場合、処理を分岐させることをおススメします。

(if
(setq FileID (open “H:/JagaimoLisp/DATA.txt” “r”)) ;条件式
(ファイルが開いた場合の処理) ;条件式がT
(ファイルが開かなかった場合の処理) ;条件式がnil
);if閉じ

if 条件式についてよくわからないという方はこちらの記事を参考にしてください。

関数 if について。

まとめ

  • 関数 openはファイルを開く関数。読み込み(“r”)、書き出し(“w”)、追加(“a”) の3種類のモードがある。
  • 関数 read-lineは開いたファイルを一行づつ読み込む関数。
  • 関数 closeは開いたファイルを閉じる関数。openとセットで使う。
  • ファイルが開けなかった場合に備えて、if を使って開けた時と開けなかった時で処理を分岐させるといい。

参考記事

関数 alert について。

ファイルを読み込んで使うコマンド例。

Comments