ブロックを積みながら(53) Node-RED、csvノードでcsvファイルの変換

Joseph Halfmoon

前回は xml(パーサ)ノードを使ってxmlファイルから所望の部分を抜き出せることを確認しました。今回はcsv(パーサ)ノードを使ってcsvから切り出してみます。ネットワーク上でやり取りする場合はXMLやJSONが普通じゃないかと思います。が、伝統のCSV、お手軽なのでローカルには普通に蔓延っている感じもしないでもない

冒頭のアイキャッチ画像にサンプルフローを掲げましたが、今回も一直線です。

  1. Injectノード、トリガをかけるだけ、payloadは使わない
  2. file inノード、サンプルCSVファイルを読み出して文字列として送る
  3. csvノード、送られてきた文字列をJSONオブジェクト化して下流へ
  4. debugノード、確認のため msg.payloadをデバッグウインドウにダンプ

file in ノードの設定を以下に示しますが、ファイルを読み取って加工もせず、文字列として垂れ流すだけの設定です。

サンプルCSVファイルとその読み取り設定Aでの読み取り

サンプルのCSVファイルは以下です。3つのフィールドがあり、カンマ区切り。真ん中のフィールドは数値のつもりです。前後の2つは文字列。ここで注目は3行目(3レコード目)です。フィールドの記載の無い空行が入っています。

最初のCSVパーサの設定が以下に。

  • 数値を変換するに「チェック」、2番目のnumフィールドには数値が入る期待
  • 空の文字を含むに「チェック」、これで空行も読み取られる?

csvSettingA

読み取り結果がこちら。空行は nameフィールドが空文字列のレコードとして読み取られてました。

result0

同じCSVファイルとその読み取り設定Bでの読み取り

今度は、同じサンプルCSVファイルを、空の文字を含むの「チェックを外して」読み取ってみました(設定Bと呼称。)

csvSettingB
読み取った結果が以下に。空行はレコードとしては処理されず無視されているみたいです。

resultB

NULL値を含むCSVファイルとその読み取り設定Bでの読み取り

今度はサンプルCSVファイルの3行目に、nameフィールドの実体はあるのだけれど、残り2つは空(null)のレコードを配置してみました。こんな感じ。

csv1
これを先ほどの設定Bで読み取ると、レコードとして認識されているものの、生成されたJSONオブジェクトには、nameプロパティしかありません。残り2つのプロパティは無しです。

resultB1

NULL値を含むCSVファイルとその読み取り設定Cでの読み取り

CSVファイルは変えず、CSVパーサの設定を以下のよう「null値を含む」に変更してみます(設定Cと呼称。)

csvSettingC

今度は、nullであっても全フィールドが読み取れました。

resultC1
CSVの処理時には、空行の有無、空のフィールドの有無など後段の処理の都合でいろいろあったりするので、この辺の制御は地味に使うかと。

ブロックを積みながら(52) Node-RED、xmlノードでxmlファイルの変換 へ戻る