2017年3月10日金曜日

Scratch 1.4へテキストファイルを読み込む

前回、Scratchのブロックを追加して、Linuxコマンドを送るようにしたので、
コマンドの出力結果をScratchへ読み込むブロックも作ってみる。

※言うまでもないですが、Scratchの改造は自己責任で!※
通常は、直接外部ファイルを読み込むためのブロックは用意されていないので、
ScratchをSmalltalkのレベルで改造する必要があり、以下を参考にして、
ブロックの追加を行った。情報を公開してくださった方々に感謝。
参考
http://itpro.nikkeibp.co.jp/article/COLUMN/20111019/371085/
http://oohito.com/nqthm/archives/2243
http://d.hatena.ne.jp/minekoa/20080314/1205484707


ブロックの追加。

('addFile %s to %L' #- #addfile:toList: 'filename')

外部ファイルを読み込んで、Scratch側のリストに追加するメソッドを設定する。
読み込むファイルまでのパスを抽出し 、空ならデフォルトのパスにする。
空でなければ、抽出したパスを使う。その上でファイルの有無を確認して処理を進める。
一行ごとに指定したリストに追加して行く。
この、リストに追加して行く処理は、まるごとScratchの「(なにか)を(リスト)に追加する」
利用する。

リストに追加して行く処理を考えている最中に、内容をTwitterにつぶやいたところ、
Smalltalkに詳しいsumimさんからスマートな方法をご教示頂きました。 有難うございました。

addfile: t1 toList: t2 
    | path file |
    path _ FileDirectory dirPathFor: t1.
    path = '' ifTrue: [path _ FileDirectory default pathName].
    ((FileDirectory on: path)
        fileExists: t1)
        ifTrue: 
            [file _ FileStream readOnlyFileNamed: t1.
            file contentsOfEntireFile lines do: [:line | self append: line toList: t2]]


先に格納用のリストを作っておく。
前回追加したブロックで、コマンドの出力をファイルにリダイレクトする文字列を実行。
リダイレクトで指定したファイルを、格納用のリストに追加するように実行。

"ls > /home/o10yan/lstest.txt"で"ls"コマンドの結果をファイルにして、
それをScratchのリストに読み込む一連の流れをやってみた。

勿論、出力結果にこだわらなくても、平文テキストファイルの読み込み用としても使える。

1 件のコメント :

  1. リストに追加する処理の、最終行にあった引数のタイプミスを直しました。
    "ts"ではなく"t2"です。失礼しました。

    返信削除