csv ファイルのデータを配列に読込む
1. 概要
file inノードとcsvノードでcsvファイルを読み込むと1行毎のオブジェクトデータとして送り出されてきます。これは、1行毎に処理したい場合には良いのですが、配列のオブジェクトとして一括で使用したい場合には困ります。
ここでは、functionノードを使って、読み込んだcsvファイルを、次の図のような1つの配列オブジェクトに変換する方法を説明します。
2. functionノードを使った変換
まず、通常のcsvファイルの読込みのNode-REDのフローを示します。injectノードとfile inノードとcsvノードとdebugノードをシリアルに配置した構成です。変更するのは、file inのファイル名の個所だけです。
この構成では、デバッグ画面に出ているように、行毎のオブジェクトが出力されてきます。
それでは、配列オブジェクトにまとめる方法を説明します。
次のようにfunctionノードを2つ追加するだけです。
この新しいフローでは、csv ノードから送られてきた行毎のオブジェクトデータを、flow変数dataに追加していきます。そのために、まず、左側の「初期化」のfunctionノードでは、dataという空行列を宣言し、flow変数dataにセットしています。
var data =[];
flow.set("data", data);
return msg;
右側の「配列生成」のfunctionノードでは、flow変数dataを取ってきます。そして、ローカル変数dataに代入します。その後、msg.payloadで送られてきた行毎のオブジェクトデータをローカル変数dataに追加(push)します。最後に、ローカル変数dataをflow変数dataに代入します。デバッグ表示のために、ローカル変数dataをmsg.payloadに代入しています。
var data = flow.get("data");
data.push(msg.payload);
flow.set("data", data);
msg.payload = data;
return msg;
csv ファイルの読込みが完了すると、flow変数dataに、配列のオブジェクトデータが出来上がります。
flow変数dataにセットしていますので、このフロー内部の別のどのノードからでも読み出せます。