前回は file inノードを使ってバイナリファイル(.wav)を読み出し、audio outノードで音声再生してみました。今回は file ノードを使ってファイルへの書き込みを行ってみます。バイナリでもテキストでも可能ですが、今回はタイムスタンプ付きのテキストを追記モードで書き込んでみます。
※「ブロックを積みながら」投稿順 index はこちら
冒頭のアイキャッチ画像に、今回使用のフローを掲げました。そのうち「タイムスタンプ」とあるのは、デフォルトで現れる Injectノードです。ボタンを押すとUnixエポックからのミリ秒を整数で payloadに載せてくるもの。また右下の「msg.payload」は、これまたデフォルトで現れる debugノードです。msg.payloadの内容をデバッグウインドウに出力するもの。
というわけで(どういうわけだ?)説明しなければならないのは、「SAMPLE TEXT」という名前の function ノードと、「sample.txt」という名前の file ノードの2つだけです。
functionノードで行っていること
functionノードで行っているのは、ファイルに書き込むべきテキストの生成です。入力 msg が飛び込んでくる度、以下のような感じのサンプルのテキスト1行を生成しておくりだします。 YYYYからssは入力から入ってくるUNIXミリ秒の時刻を人間が分かり易いように変換した「ローカル」時刻であります。行番号は処理した行の連番です。
YYYY/MM/DD hh:mm:ss SAMPLE TEXT(行番号)
設定は以下の通り。
行番号連番のために contextのローカルストレージ内にNUMLINEというエントリを設け、そこに行番号を蓄えて処理の度に更新しています。また、UNIX式のミリ秒を示す整数を読みやすい形式で出力するために、いったんDate型のオブジェクトを作ったりもしています。
なお、context内のNUMLINEの初期化のため、初期化処理も使用しています。こんな感じ。
fileノードで行っていること
fileノードの書き込み先のファイルはフルパスで設定した方が身のためな感じなので、そうしています。
設定はファイルへ追記(APPEND)としています。やって見たところでは、ファイルが存在しなければ作ってそこに書き込んでくれます。毎回上書きモードでファイルを生成することも可能です。
文字コードもいろいろ選べます。今回は無難な utf8にしています。確かめてないのですが、payloadにバイナリ載せるのもOKみたい。また、ファイル名を入力msg内のfilenameプロパティで決めることも可能みたいです(やっておらんけど。)なお、動作のプルダウンメニューには指定したファイルを削除するという「動作」もあり。
動作結果
Injectボタンを押す度、デバッグウインドウには以下のような msg が到来します。予定通り。
一方指定したディレクトリを観察していると、ファイルが生成され、上記のmsg.payloadに載っている文字列が「行」として記録されていきます。