• V
 

将文本分割成每行一个消息

问题

你想对一块文本中的每一行执行操作。例如,你想在每行的开头添加行号。

解决方案

Split 节点可以用来将消息分割成每行一个消息。它可以后续跟随需要对文本的各个行进行操作的节点,最后再跟一个 Join 节点将它们重新组合成一个文本块。

示例

[{"id":"df6514f0.029748","type":"inject","z":"64133d39.bb0394","name":"inject","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":"","x":110,"y":900,"wires":[["11f53f61.2f7be1"]]},{"id":"11f53f61.2f7be1","type":"template","z":"64133d39.bb0394","name":"","field":"payload","fieldType":"msg","format":"handlebars","syntax":"mustache","template":"one\ntwo\nthree\nfour\nfive","x":240,"y":900,"wires":[["760c1d71.c29744"]]},{"id":"760c1d71.c29744","type":"split","z":"64133d39.bb0394","name":"","splt":"\\n","x":190,"y":960,"wires":[["3e427aac.9b9596"]]},{"id":"3e427aac.9b9596","type":"change","z":"64133d39.bb0394","name":"添加行号","rules":[{"t":"set","p":"payload","pt":"msg","to":"(parts.index+1) & \": \" & payload","tot":"jsonata"}],"action":"","property":"","from":"","to":"","reg":false,"x":360,"y":960,"wires":[["d44d4767.945fd8"]]},{"id":"d44d4767.945fd8","type":"join","z":"64133d39.bb0394","name":"","mode":"auto","build":"string","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","timeout":"","count":"","x":530,"y":960,"wires":[["bfe3e43b.85fa88"]]},{"id":"bfe3e43b.85fa88","type":"debug","z":"64133d39.bb0394","name":"调试","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","x":650,"y":960,"wires":[]}]

讨论

在示例中,InjectTemplate 节点用于注入一块包含多行的文本。

one
two
three
four
five

Split 节点在接收到字符串时的默认行为是将其分割为每行一个消息。

Change 节点使用一个 JSONata 表达式修改每个消息的负载:(parts.index+1) & ": " & payload —— 它使用 msg.parts.index 获取行号,并将其添加到现有的 msg.payload 前面。

最后,Join 节点将消息重新组装成一个单独的文本块:

1: one
2: two
3: three
4: four
5: five