Sponsored links

【AutoLISP データ読み込み】複数行のTXT/CSV ファイルを読み込む

Sponsored links
low angle view of spiral staircase AutoLISP
Photo by Pixabay on Pexels.com
Sponsored links

テキスト形式の情報を読み込む方法です。今回は複数行のテキストファイルから1行づつ読み込みます。CSVファイルも同じように読み込めます。

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

Sponsored links

予備知識

関数 open, close, read-line を使って1行のテキストファイルから読み込む記事です。
これを元に今回は複数行読み込む方法を説明します。

複数行のテキストファイルを読み込むのに繰り返し関数 while を使います。

ファイル読み込み

read-line は、読み込むたびに次の行を読み込みます。

関数 open で開く。

関数 read-line で1行読み込む
関数 while で繰り返して1行づつ処理をしていく

関数 close で閉じる

という流れです。

ではまず、実際にテキストファイルを用意して、コマンドラインに入力しながら read-lineの動きを確認してみましょう。

テキストファイルの準備

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

open で開く

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

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

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

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

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

コマンドラインに下記の通り入力してください。(”C:/JagaimoLisp/DATA.txt” の部分は保存したメモ帳のパスを入れてください)”r” は読み込みモードです。

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

入力後、エンターキーで実行です。

read-line で1行目を読み込む

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

(alert (read-line FileID))

1行目のテキストを読み込んでメッセージボックスが現れます。

read-line で2行目読み込む

1行目を読み込んだ後、全く同じコードを入力します。

(alert (read-line FileID))

2行目のテキストを読み込んでメッセージボックスが現れます。

また同じコードを入力すれば3行目のテキストを使ってメッセージボックスが現れます。
このように、関数 read-line を繰り返すことで1行づつ次々と読み込むことが出来ます。

close で閉じる

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

(close FileID)

関数 while を使って read-line を繰り返す

上記の例をまとめてコマンドにすると以下のようになります。
コマンド名は test です。
テキストを1行づつ読み込んでメッセージボックスで読み込んだ文字を表示します。

 (defun c:test (/ Tx FileID)
  
    (if (setq FileID (open "C:/JagaimoLisp/DATA.txt" "r")) ;読み込みモードで開く
      
      (progn   ;もしファイルを開けたら 
        
        (while  (setq Tx (read-line FileID)) ;文字列がある間1行づつ読み込む。
          (alert Tx) ;読み込んだ文字列をメッセージボックスに表示
        );while
        
        (close FileID);ファイルを閉じる
      
      );progn
      
      (alert "ファイルが見つかりませんでした") ;開けなかったら場合はこのメッセージを出す
    
    );if
  
(princ));defun

指定したパスからファイルが読み込めなかった場合に備えて関数 if を入れて、もしファイルが開けた場合にだけ read-line に進んでテキストを読み込んで表示させるようにしています。

(while (setq Tx (read-line FileID))

関数 while は条件式が nil でなければ繰り返します。
今回の場合、条件式は (setq Tx (read-line FileID)) です。

最終行に行くまではread-lineで1行づつ読み込まれ、変数Txに代入された値が戻り値になるので繰り返されます。

最終行を終えると戻り値が nil になるのでwhile の繰り返しが終わります。

まとめ

  • 関数 read-lineは開いたファイルを一行づつ読み込む関数。
  • 関数 while を使うと最後の行まで順番に読み込んでいくプログラムになる。

参考記事

関数 open, close, read-line について。

関数 while について。

戻り値 nil について。

関数 alert について。

関数 if について。

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

Comments