ブロックを積みながら(49) Node-RED、fileノードでファイルへ書き込み

Joseph Halfmoon

前回は 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(行番号)

設定は以下の通り。

Function
行番号連番のために contextのローカルストレージ内にNUMLINEというエントリを設け、そこに行番号を蓄えて処理の度に更新しています。また、UNIX式のミリ秒を示す整数を読みやすい形式で出力するために、いったんDate型のオブジェクトを作ったりもしています。

なお、context内のNUMLINEの初期化のため、初期化処理も使用しています。こんな感じ。
FunctionInit

fileノードで行っていること

fileノードの書き込み先のファイルはフルパスで設定した方が身のためな感じなので、そうしています。

設定はファイルへ追記(APPEND)としています。やって見たところでは、ファイルが存在しなければ作ってそこに書き込んでくれます。毎回上書きモードでファイルを生成することも可能です。

文字コードもいろいろ選べます。今回は無難な utf8にしています。確かめてないのですが、payloadにバイナリ載せるのもOKみたい。また、ファイル名を入力msg内のfilenameプロパティで決めることも可能みたいです(やっておらんけど。)なお、動作のプルダウンメニューには指定したファイルを削除するという「動作」もあり。

File

動作結果

Injectボタンを押す度、デバッグウインドウには以下のような msg が到来します。予定通り。

Debug
一方指定したディレクトリを観察していると、ファイルが生成され、上記のmsg.payloadに載っている文字列が「行」として記録されていきます。

FileCreated
予定通りに書き込めて良かった。

ブロックを積みながら(48) Node-RED、play audioノードにwavファイル へ戻る

ブロックを積みながら(50) Node-RED、html(パース)ノードで要素の抽出 へ進む