# Function String Extract

**URL:** <https://discourse.nodered.org/t/function-string-extract/6775>\
**Category:** General\
**Created:** [14 January 2019 06:51 UTC](https://discourse.nodered.org/t/function-string-extract/6775 "2019-01-14T06:51:46Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 06:51 UTC](https://discourse.nodered.org/t/function-string-extract/6775/1 "2019-01-14T06:51:46Z")

</div>

Hello,  
i want to read my out my electric meter over serial, and store it into a MySqlDatabase.  
I get datas from the meter, but i dont now how i can seperate the values.  
Serial output give me lines, the information that i need is in line 10,11,12 and 13.  
I want to seperate it.

![meter](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/2X/8/8959d3e55572f551fd6c45536bb57a9af0b39227.jpeg)

Many Thanks,  
Markus

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [14 January 2019 07:07 UTC](https://discourse.nodered.org/t/function-string-extract/6775/2 "2019-01-14T07:07:49Z")

</div>

Hi Markus,  
Just out of curiousity - what hardware did you use to get the reading out of the SMART meter?

---

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 07:53 UTC](https://discourse.nodered.org/t/function-string-extract/6775/3 "2019-01-14T07:53:56Z")

</div>

hi, a raspberry pi 3 and a usb infrared diode somthing like this  
[https://www.google.com/search?q=zähler+infrarot+auslesen&rlz=1C1GCEU\_deAT821AT821&tbm=isch&source=lnms&sa=X&ved=0ahUKEwis8rCc5ezfAhUksqQKHdPCDekQ\_AUI1AEoAQ&biw=1680&bih=977&safe=active&ssui=on#imgrc=GwiBPdiaEMdTaM:](https://www.google.com/search?q=z%C3%A4hler+infrarot+auslesen&rlz=1C1GCEU_deAT821AT821&tbm=isch&source=lnms&sa=X&ved=0ahUKEwis8rCc5ezfAhUksqQKHdPCDekQ_AUI1AEoAQ&biw=1680&bih=977&safe=active&ssui=on#imgrc=GwiBPdiaEMdTaM:)

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 10:07 UTC](https://discourse.nodered.org/t/function-string-extract/6775/4 "2019-01-14T10:07:20Z")

</div>

Well that looks like a string but it is hard to tell what is behind the red box. Please copy and post the debug data to a reply.

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 10:19 UTC](https://discourse.nodered.org/t/function-string-extract/6775/5 "2019-01-14T10:19:58Z")

</div>

you could try this. Add a change node after where the data comes out and select the jsonata option and add in `$substring(payload,6,11)` - note you may have to play with the offsets  
 ![33%20AM](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/2X/9/959368da581f9312ccd28f16e6de1bf04bf4963a.png)

---

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 10:32 UTC](https://discourse.nodered.org/t/function-string-extract/6775/6 "2019-01-14T10:32:21Z")

</div>

![detail](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/2X/b/bc5e6266983a4cd55f977f471c29795eb98fd3ad.jpeg)

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 10:36 UTC](https://discourse.nodered.org/t/function-string-extract/6775/7 "2019-01-14T10:36:05Z")

</div>

Oh after you extract the data, you may want to change it to a number - since it is a string - depending on how you want to use it.

---

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 11:43 UTC](https://discourse.nodered.org/t/function-string-extract/6775/8 "2019-01-14T11:43:11Z")

</div>

i need the value after "1.8.1" and "1.8.2" and "2.8.1" and "2.8.2" as number to an output  
for example "1.8.2" (00005760.291) output 5760.291

thanks

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 11:45 UTC](https://discourse.nodered.org/t/function-string-extract/6775/9 "2019-01-14T11:45:50Z")

</div>

And did you try what I suggested?

---

<div class="post-metadata">

**Author:** ![hotNipi](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/hotnipi/32/383_2.png) [@hotNipi](https://discourse.nodered.org/u/hotNipi)\
**Post date:** [14 January 2019 11:54 UTC](https://discourse.nodered.org/t/function-string-extract/6775/10 "2019-01-14T11:54:05Z")

</div>

Function way:

> var parts = msg.payload.split("(");  
> msg.key = parts[0];  
> msg.val = parseFloat(parts[1]);  
> return msg;

---

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 11:58 UTC](https://discourse.nodered.org/t/function-string-extract/6775/11 "2019-01-14T11:58:31Z")

</div>

Yes, this works sorry i have forget to set the "to" to expression.

the serial output give me lines, how can i count these lines to sort out what i want?

or better to find for example "1.8.1"

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 12:26 UTC](https://discourse.nodered.org/t/function-string-extract/6775/12 "2019-01-14T12:26:55Z")

</div>

Using @hotNipi function, take a look at the `switch` node and see if that will help.

---

<div class="post-metadata">

**Author:** ![WimmerM](https://avatars.discourse-cdn.com/v4/letter/w/e19adc/32.png) [@WimmerM](https://discourse.nodered.org/u/WimmerM)\
**Post date:** [14 January 2019 12:52 UTC](https://discourse.nodered.org/t/function-string-extract/6775/13 "2019-01-14T12:52:24Z")

</div>

many thanks, to you (zenofmud and hotNipi)  
final funktion  
var parts = msg.payload.split("(");  
msg.key = parts[0];  
if (msg.key == "1.8.1")  
{  
msg.val = parseFloat(parts[1]);  
return msg;  
}

---

<div class="post-metadata">

**Author:** ![shrickus](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/shrickus/32/517_2.png) [@shrickus](https://discourse.nodered.org/u/shrickus)\
**Post date:** [14 January 2019 14:32 UTC](https://discourse.nodered.org/t/function-string-extract/6775/14 "2019-01-14T14:32:06Z")

</div>

This example is crying for a Regex solution, imo...

```auto
var parts = msg.payload.match(/([\d.]+)\(([\d.]+)\*(\w+)\)/);
msg.payload = {
    id: parts[1],
    value: parseFloat(parts[2]),
    units: parts[3]
};
return msg;

```

With the incoming data listed above, the output payload will be:

```auto
{
    "id": "1.8.2",
    "value": 5760.291,
    "units": "kWh"
}

```

---

<div class="post-metadata">

**Author:** ![zenofmud](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/zenofmud/32/316_2.png) [@zenofmud](https://discourse.nodered.org/u/zenofmud)\
**Post date:** [14 January 2019 14:51 UTC](https://discourse.nodered.org/t/function-string-extract/6775/15 "2019-01-14T14:51:02Z")

</div>

@shrickus regex makes my head hurt - I never spend enougth time with it so each time is like starting over again and again and ...

---

<div class="post-metadata">

**Author:** ![shrickus](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/shrickus/32/517_2.png) [@shrickus](https://discourse.nodered.org/u/shrickus)\
**Post date:** [14 January 2019 14:54 UTC](https://discourse.nodered.org/t/function-string-extract/6775/16 "2019-01-14T14:54:48Z")

</div>

Heh heh, you are not alone... I've always suspected that I'm wired differently, but since my sweet-spots seem to be things like xslt, map-reduce, jsonata, and regex -- well, it's pretty obviously true!

BTW, so as not to disappoint -- here is the equivalent JSONata expression:

```auto
payload.$match(/([\d.]+)\(0*([\d.]+)\*(\w+)\)/) {
    "id": groups[0],
    "value": $number(groups[1]),
    "units": groups[2]
}

```

---

<div class="post-metadata">

**Author:** ![dynamicdave](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/dynamicdave/32/96_2.png) [@dynamicdave](https://discourse.nodered.org/u/dynamicdave)\
**Post date:** [14 January 2019 15:49 UTC](https://discourse.nodered.org/t/function-string-extract/6775/17 "2019-01-14T15:49:55Z")

</div>

Hi Steve,  
I was waiting patiently for the JSONata to appear - and then, as if by magic, it did.

Happy New Year from Dynamic Dave in the UK

---

<div class="post-metadata">

**Author:** ![Navybrandon](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/navybrandon/32/13021_2.png) [@Navybrandon](https://discourse.nodered.org/u/Navybrandon)\
**Post date:** [1 October 2019 18:57 UTC](https://discourse.nodered.org/t/function-string-extract/6775/18 "2019-10-01T18:57:27Z")

</div>

Can anyone help me pull data out of the below string? I need Address, deviceid maxADU, segmentation, vendorid, object type, vendorid.

msg : Object  
object  
payload: string  
vendorId----------\> 7  
pi : TTY=unknown ; PWD=/home/pi ; USER=root ; COMMAND=/usr/bin/node-red-log 1  
pam\_unix(sudo:session): session opened for user root by (uid=0)  
1 Oct 13:54:19 - [error] [change:b5f40521.772738] Invalid JSONata expression: Argument 1 of function "substring" does not match function signature  
root : TTY=unknown ; PWD=/home/pi ; USER=root ; COMMAND=/bin/journalctl -f -n 25 -u nodered -o cat  
pam\_unix(sudo:session): session opened for user root by (uid=0)  
1 Oct 13:55:04 - [info] Stopping flows  
1 Oct 13:55:04 - [info] Stopped flows  
1 Oct 13:55:04 - [info] Starting flows  
1 Oct 13:55:06 - [info] Started flows  
1 Oct 13:55:08 - [info] Stopping flows  
1 Oct 13:55:08 - [info] Stopped flows  
1 Oct 13:55:08 - [info] Starting flows  
1 Oct 13:55:10 - [info] Started flows  
address----------\> 192.168.251.55  
deviceId----------\> 55  
maxApdu----------\> 1476  
segmentation----------\> 0  
vendorId----------\> 7  
object type----------\> 7  
vendorId----------\> 7  
pi : TTY=un...  
socketid: "7E5dLH4WdG\_0NLzKAAAA"  
\_msgid: "17d752ed.11c22d"

---

<div class="post-metadata">

**Author:** ![bakman2](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/bakman2/32/6207_2.png) [@bakman2](https://discourse.nodered.org/u/bakman2)\
**Post date:** [1 October 2019 19:00 UTC](https://discourse.nodered.org/t/function-string-extract/6775/19 "2019-10-01T19:00:40Z")

</div>

Please make your own topic, and make sure to copy the debug output from the browser.

---

<div class="post-metadata">

**Author:** ![Marchel](https://avatars.discourse-cdn.com/v4/letter/m/7cd45c/32.png) [@Marchel](https://discourse.nodered.org/u/Marchel)\
**Post date:** [1 December 2019 22:38 UTC](https://discourse.nodered.org/t/function-string-extract/6775/20 "2019-12-01T22:38:49Z")

</div>

> [@shrickus](#):
>
> Regex solution

Hello shrickus,  
That looks nice!  
But I get error messages.  
What goes wrong?  
[See printout](https://drive.google.com/drive/folders/11SoK3fveJot6RCY7EwTv_R4ZWNBM90-o?usp=sharing)

[Next page](https://discourse.nodered.org/t/function-string-extract/6775.md?page=2)
