# How to list files and parse them

**URL:** <https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083>\
**Category:** General\
**Created:** [17 November 2020 17:59 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083 "2020-11-17T17:59:49Z")\
**Posts on this page:** 20\
**Page:** 1

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 17:59 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/1 "2020-11-17T17:59:50Z")

</div>

Hi, the following code is working with a fixed file name (M:\1401.log) but I would like to do the flow on all files in the folder (M:)

```auto
[{"id":"8318c004.83b59","type":"csv","z":"bb550778.477b88","name":"Split Fields","sep":";","hdrin":"","hdrout":false,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":650,"y":1440,"wires":[["1d090ba3.ec32d4"]]},{"id":"4f953002.8b7c9","type":"MSSQL","z":"bb550778.477b88","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES (\n 1401,\n '{{{payload.DateTime}}}',\n '{{{payload.JobName}}}',\n 0,\n '{{{payload.Tempo}}}')\n","outField":"payload","returnType":"0","throwErrors":"0","x":1260,"y":1440,"wires":[["c51e442f.2dec48"]]},{"id":"1d090ba3.ec32d4","type":"function","z":"bb550778.477b88","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":850,"y":1440,"wires":[["4282c280.9b645c"]]},{"id":"2ac0e854.36d828","type":"file in","z":"bb550778.477b88","name":"MY700 1401","filename":"M:\\1401.log","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":470,"y":1440,"wires":[["8318c004.83b59"]]},{"id":"472cccef.ef3564","type":"inject","z":"bb550778.477b88","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":320,"y":1440,"wires":[["2ac0e854.36d828"]]},{"id":"c51e442f.2dec48","type":"debug","z":"bb550778.477b88","name":"","active":false,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1430,"y":1440,"wires":[]},{"id":"4282c280.9b645c","type":"function","z":"bb550778.477b88","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":1050,"y":1440,"wires":[["4f953002.8b7c9"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]
```

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 18:04 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/2 "2020-11-17T18:04:40Z")

</div>

You can get a list of files in a directory using the fs-ops nodes.

Then feed that through a split node to generate a stream of messages. Feed that into your existing flow to perform the whole directory.

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 18:11 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/3 "2020-11-17T18:11:44Z")

</div>

Hi Steve,  
Many thanks again.  
I tried with fs-ops-dir but I can't use the msg.files output as the filename of the "file in" node.  
This is the best I did:

```auto
[{"id":"b8b24107.4bd19","type":"function","z":"c303fd5a.ebb02","name":"File list","func":"//for (var i = 0; i < msg.files.length; i++) {\nmsg.origPayload = msg.files;\n\nfor (var i = 0; i < msg.files.length; i++) {\nmsg.payload = {\n File: msg.files[i]\n}\n}\nreturn msg;\n\n","outputs":1,"noerr":0,"x":380,"y":1040,"wires":[["1ac98620.4f6f0a"]]},{"id":"1ac98620.4f6f0a","type":"debug","z":"c303fd5a.ebb02","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":550,"y":1100,"wires":[]},{"id":"6292b382.6fb88c","type":"debug","z":"c303fd5a.ebb02","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"files","targetType":"msg","x":380,"y":1100,"wires":[]},{"id":"11138cd3.7ff763","type":"fs-ops-dir","z":"c303fd5a.ebb02","name":"","path":"payload","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":220,"y":1040,"wires":[["6292b382.6fb88c","b8b24107.4bd19"]]},{"id":"68113237.b8580c","type":"inject","z":"c303fd5a.ebb02","name":"","topic":"","payload":"M:\\","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":90,"y":1040,"wires":[["11138cd3.7ff763"]]}]
```

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 18:32 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/4 "2020-11-17T18:32:34Z")

</div>

> [@Simone](#):
>
> but I can't use the msg.files output as the filename of the "file in" node.

Hi Simone, sure you can.

Try this....

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/0/3/0394b147adf9f4590cc87e8010d72f2bb51d5d7b.png)

Demo flow (note - check and adjust values in the inject and select YOUR sql server in the MSSQL node)

```auto
[{"id":"472cccef.ef3564","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"payload"},{"p":"topic","vt":"str"},{"p":"path","v":"c:\\temp","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"","payloadType":"date","x":120,"y":120,"wires":[["cf866343.44c33"]]},{"id":"cf866343.44c33","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.csv","filterType":"str","dir":"files","dirType":"msg","x":180,"y":220,"wires":[["70421ae5.184d54"]]},{"id":"aa7223e3.b534d","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":220,"wires":[["21443ea7.a8e922"]]},{"id":"c320f285.44f34","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":220,"wires":[["aa7223e3.b534d"]]},{"id":"70421ae5.184d54","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":220,"wires":[["c320f285.44f34"]]},{"id":"f84b0b2e.6b5318","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":320,"wires":[["4c133809.cbfcb8","c5984f0a.6348a"]]},{"id":"1bfa340a.3b3e0c","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":320,"wires":[["f84b0b2e.6b5318"]]},{"id":"69db2515.6afcac","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"include_empty_strings":false,"include_null_values":false,"x":370,"y":320,"wires":[["1bfa340a.3b3e0c"]]},{"id":"21443ea7.a8e922","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":320,"wires":[["69db2515.6afcac"]]},{"id":"4c133809.cbfcb8","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":320,"wires":[]},{"id":"c5984f0a.6348a","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n 1401, @dt, @jn, 0, @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"","paramsOptType":"editor","params":[{"output":false,"name":"dt","type":"VarChar(20)","valueType":"msg","value":"payload.DateTime"},{"output":false,"name":"jn","type":"VarChar(20)","valueType":"msg","value":"payload.JobName"},{"output":false,"name":"tempo","type":"VarChar(20)","valueType":"msg","value":"payload.Tempo"}],"x":960,"y":280,"wires":[["83e1c0ae.3ad9f"]]},{"id":"83e1c0ae.3ad9f","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":280,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

```

Can i also suggest you use SQL parameters instead of mustache? it removes the chance of SQL injection.

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/e/9/e9a71358a8735ad9243097eae88e7abcacc10bd6.png)

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 18:53 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/5 "2020-11-17T18:53:06Z")

</div>

We are very close to the solution but the output path is not right.  
I'm using: msg.filename = "\10.0.0.4\C$\LOG\_MY700\" + msg.payload;  
but there is an error because becomes C:\10.0.0.4\C$\LOG\_MY700\filexxxxx.log  
C:\ instead of a network path \10.0.0.4....

17/11/2020, 19:50:48[node: 93b631b3.6d1c1](http://10.0.0.4:1880/#)msg : Object

object

topic: ""

payload: "TRLOG\_20201110.log"

files: array[97]

parts: object

\_msgid: "2f88495e.6e2ce6"

file: "TRLOG\_20201110.log"

filename: "\10.0.0.4\C$\LOG\_MY700\TRLOG\_20201110.log"

error: object

message: "Error: ENOENT: no such file or directory, open 'C:\10.0.0.4\C$\LOG\_MY700\TRLOG\_20201110.log'"

source: object

stack: "Error: ENOENT: no such file or directory, open 'C:\10.0.0.4\C$\LOG\_MY700\TRLOG\_20201110.log'"

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 18:55 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/6 "2020-11-17T18:55:39Z")

</div>

> [@Simone](#):
>
> I'm using: msg.filename = "\10.0.0.4\C$\LOG\_MY700" + msg.payload;

No, dont do that. change the the function "make filename" back to how I posted it and instead set the `path` in the inject to `\\10.0.0.4\C$\LOG_MY700`

Original content of "make filename" function node...

```auto
msg.file = msg.payload;
msg.filename = msg.path + "\\" + msg.payload;
return msg;

```

Ps, please always enclose code or data in backticks like this  
`````  
`code / flow should be put between backticks to maintain formatting and prevent the forum from corrupting code`  
`````

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 19:09 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/7 "2020-11-17T19:09:34Z")

</div>

Erase and Rewind:

```auto
[{"id":"f6eee3e0.0ad3f","type":"inject","z":"395fc7e.7342338","name":"","topic":"","payload":"\\\\10.0.0.4\\C$\\LOG_MY700","payloadType":"str","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":210,"y":1040,"wires":[["ec378c9a.79824"]]},{"id":"ec378c9a.79824","type":"fs-ops-dir","z":"395fc7e.7342338","name":"","path":"payload","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":220,"y":1140,"wires":[["1aaa03d3.48e8ec"]]},{"id":"bf80254a.f30e98","type":"function","z":"395fc7e.7342338","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"x":780,"y":1140,"wires":[["46a592a.b62ec6c"]]},{"id":"4c1b9640.0c1098","type":"split","z":"395fc7e.7342338","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":610,"y":1140,"wires":[["bf80254a.f30e98"]]},{"id":"1aaa03d3.48e8ec","type":"change","z":"395fc7e.7342338","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":420,"y":1140,"wires":[["4c1b9640.0c1098"]]},{"id":"ea9e8d78.73c9","type":"function","z":"395fc7e.7342338","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":810,"y":1240,"wires":[["aa6c04b3.3521c8","deefece1.f4dcb"]]},{"id":"67debf30.6cb48","type":"function","z":"395fc7e.7342338","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":610,"y":1240,"wires":[["ea9e8d78.73c9"]]},{"id":"f769e2f4.5bc25","type":"csv","z":"395fc7e.7342338","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":410,"y":1240,"wires":[["67debf30.6cb48"]]},{"id":"46a592a.b62ec6c","type":"file in","z":"395fc7e.7342338","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":230,"y":1240,"wires":[["f769e2f4.5bc25"]]},{"id":"aa6c04b3.3521c8","type":"debug","z":"395fc7e.7342338","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":1300,"wires":[]},{"id":"deefece1.f4dcb","type":"MSSQL","z":"395fc7e.7342338","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n 1401, @dt, @jn, 0, @tempo\n)\n","outField":"payload","returnType":"0","throwErrors":"0","x":1000,"y":1200,"wires":[["5d960652.ce12d8"]]},{"id":"5d960652.ce12d8","type":"debug","z":"395fc7e.7342338","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1170,"y":1200,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

```

I changed to my solution because the errors was:

```auto
Error: ENOENT: no such file or directory, open 'C:\Users\simone\Desktop\AVVIO per i4.0\undefined\TRLOG_20200604.log'

```

The path C:\Users\simone\Desktop\AVVIO per i4.0\ is NODERED batch path.  
I have an error for each file (i.e. TRLOG\_20200604.log).

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 19:14 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/8 "2020-11-17T19:14:30Z")

</div>

You have spaces in the path so must be enclosed in quotes.

try this...

```auto
[{"id":"4cc7e76f.58c6a8","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"path","v":"\\\\10.0.0.4\\C$\\LOG_MY700","vt":"str"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","x":110,"y":420,"wires":[["4da07132.59016"]]},{"id":"4da07132.59016","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":180,"y":520,"wires":[["964df544.198fe8"]]},{"id":"485ab093.31f22","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":520,"wires":[["2d3b49a0.86dae6"]]},{"id":"7fc0b0f4.f526c","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":520,"wires":[["485ab093.31f22"]]},{"id":"964df544.198fe8","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":520,"wires":[["7fc0b0f4.f526c"]]},{"id":"2a03c787.f3e9d8","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":620,"wires":[["31abdef8.f2bc62","89a8152a.e76ff8"]]},{"id":"8263b67c.d95168","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":620,"wires":[["2a03c787.f3e9d8"]]},{"id":"60828592.64be6c","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":370,"y":620,"wires":[["8263b67c.d95168"]]},{"id":"2d3b49a0.86dae6","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":620,"wires":[["60828592.64be6c"]]},{"id":"31abdef8.f2bc62","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":680,"wires":[]},{"id":"89a8152a.e76ff8","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n 1401, @dt, @jn, 0, @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"queryParams","paramsOptType":"msg","params":[],"x":960,"y":580,"wires":[["38db9102.77324e"]]},{"id":"38db9102.77324e","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":580,"wires":[]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

```

NOTE: I seen you changed the inject to inject into `payload` instead of `path` - this wont work because the change node will deleted it before the function can make file name.

Also, I see you have lost the parameters for the SQL - are you using MSSQL-PLUS? you will need this NOT the old unsupported MSSQL

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 19:16 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/9 "2020-11-17T19:16:37Z")

</div>

Does you inject node look like this & allow you to enter path as a msg property?

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/4/7/4795bf235dd7fe2dfee9b69a0de708edb2182361.png)

Do you see this is MSSQL node?

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/9/e/9e8cec8bf731c88ae4e1d99c13a2db2c6ef3d31d.png)

What version node-red are you using?

![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/b/c/bc380aba2c74f4ce5792bb380f93d8468b3788e8.png)

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 19:44 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/10 "2020-11-17T19:44:00Z")

</div>

This is my Inject node properties page:

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/a/f/aff7e09f6ddf5d556ff61962869ff407f1e5de9e.png)  
and so, I have changed the fs-ops-dir in this way:  
 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/4/3/43456ae5ee80cd82129c518dd59fa5f83647d54f.png)

NodeRed is v1.0.3 and I prefer to not upgrade because I have a lot of flows...  
I wouldn't want the headache to fix everything... 🙂

SQL node is fine because it's working with the fixed file name.

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 19:46 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/11 "2020-11-17T19:46:04Z")

</div>

ok, so instead of setting path in the inject, put a change node after the inject & set msg.path to `\\10.0.0.4\C$\LOG_MY700`

Also, you did not answer, are you using MSSQL-PLUS? Are you using parameters?

> [@Simone](#):
>
> and so, I have changed the fs-ops-dir in this way:

the problem with that is payload gets overwritten in the next node and msg.path is NOT set (meaning the function cannot do the path+file join)

PS, upgrading is very straightforward & fairly risk free.

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 19:52 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/12 "2020-11-17T19:52:26Z")

</div>

Try this instead...

```auto
[{"id":"984775e4.ae00c8","type":"tab","label":"Flow 1","disabled":false,"info":""},{"id":"472cccef.ef3564","type":"inject","z":"984775e4.ae00c8","name":"","props":[{"p":"topic","vt":"str"},{"p":"payload"}],"repeat":"","crontab":"","once":false,"onceDelay":0.1,"topic":"","payload":"true","payloadType":"bool","x":110,"y":120,"wires":[["2d35441d.b4dd1c"]]},{"id":"cf866343.44c33","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.csv","filterType":"str","dir":"files","dirType":"msg","x":180,"y":220,"wires":[["70421ae5.184d54"]]},{"id":"aa7223e3.b534d","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":220,"wires":[["21443ea7.a8e922"]]},{"id":"c320f285.44f34","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":220,"wires":[["aa7223e3.b534d"]]},{"id":"70421ae5.184d54","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":220,"wires":[["c320f285.44f34"]]},{"id":"f84b0b2e.6b5318","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":320,"wires":[["4c133809.cbfcb8","c5984f0a.6348a"]]},{"id":"1bfa340a.3b3e0c","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":570,"y":320,"wires":[["f84b0b2e.6b5318"]]},{"id":"69db2515.6afcac","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":"none","multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"include_empty_strings":false,"include_null_values":false,"x":370,"y":320,"wires":[["1bfa340a.3b3e0c"]]},{"id":"21443ea7.a8e922","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":320,"wires":[["69db2515.6afcac"]]},{"id":"4c133809.cbfcb8","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":320,"wires":[]},{"id":"c5984f0a.6348a","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n 1401, @dt, @jn, 0, @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"","paramsOptType":"editor","params":[{"output":false,"name":"dt","type":"VarChar(20)","valueType":"msg","value":"payload.DateTime"},{"output":false,"name":"jn","type":"VarChar(20)","valueType":"msg","value":"payload.JobName"},{"output":false,"name":"tempo","type":"VarChar(20)","valueType":"msg","value":"payload.Tempo"}],"x":960,"y":280,"wires":[["83e1c0ae.3ad9f"]]},{"id":"83e1c0ae.3ad9f","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":280,"wires":[]},{"id":"4da07132.59016","type":"fs-ops-dir","z":"984775e4.ae00c8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":180,"y":520,"wires":[["964df544.198fe8"]]},{"id":"485ab093.31f22","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":740,"y":520,"wires":[["2d3b49a0.86dae6"]]},{"id":"7fc0b0f4.f526c","type":"split","z":"984775e4.ae00c8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":570,"y":520,"wires":[["485ab093.31f22"]]},{"id":"964df544.198fe8","type":"change","z":"984775e4.ae00c8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":380,"y":520,"wires":[["7fc0b0f4.f526c"]]},{"id":"2a03c787.f3e9d8","type":"function","z":"984775e4.ae00c8","name":"transform MY700-2","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar a = msg.payload.a;\nvar Data = msg.payload.DateTime;\nvar Jobs = msg.payload.JobName;\nvar Altro = msg.payload.Payl;\n//separo il campo altro usando la virgola come separatore di campo\nlet Parts = Altro.split(',');\n//Calcolo la lunghezza perchè alcuni campi hanno sia un prefisso sia \n//un suffisso da rimuovere\nvar Lunghezza0 = Parts[0].length;\nvar Lunghezza1 = Parts[1].length;\nvar Lunghezza2 = Parts[2].length;\nvar Lunghezza3 = Parts[3].length;\nvar Lunghezza4 = Parts[4].length;\nvar Lunghezza5 = Parts[5].length;\nvar Lunghezza6 = Parts[6].length;\nvar Lunghezza7 = Parts[7].length;\nvar Lunghezza8 = Parts[8].length;\nvar Lunghezza9 = Parts[9].length;\nvar Lunghezza10 = Parts[10].length;\nvar Lunghezza11 = Parts[11].length;\n\n\n//estraggo tutti i campi che ci sono, non servono tutti\n\n\n//Estraggo la durata che ha 10 caratteri davanti e 7 in coda\nvar Seconds = Parts[0].substring(10, Lunghezza0-7);\n\n//Estraggo il numero di DOT che ha 22 caratteri davanti\nvar Dots = Parts[1].substring(22, Lunghezza1);\n\n//Estraggo il feed che ha 18 caratteri davanti \nvar Feeds = Parts[2].substring(18, Lunghezza2);\n\n//Estraggo il n° di strips che ha 18 caratteri davanti \nvar Strips = Parts[3].substring(18, Lunghezza3);\n\n//Estraggo Model ID che ha 10 caratteri davanti \nvar MID = Parts[4].substring(10, Lunghezza4);\n\n//Estraggo Model Revision che ha 16 caratteri davanti \nvar MR = Parts[5].substring(16, Lunghezza5);\n\n//Estraggo Job Name che ha 10 caratteri davanti \nvar JN = Parts[6].substring(10, Lunghezza6);\n\n//Estraggo npcb ID che ha 8 caratteri davanti \nvar npcbID = Parts[7].substring(8, Lunghezza7);\n\n//Estraggo batch ID che ha 10 caratteri davanti \nvar batchID = Parts[8].substring(10, Lunghezza8);\n\n//Estraggo Media Batch Name che ha 18 caratteri davanti \nvar MBN = Parts[9].substring(18, Lunghezza9);\n\n//Estraggo Current Cassette che ha 18 caratteri davanti \nvar CC = Parts[10].substring(18, Lunghezza10);\n\n//Estraggo Head che ha 6 caratteri davanti \nvar Heads = Parts[11].substring(6, Lunghezza11);\n\n//Se in Job Name è presente AP, ovvero il job è la stampa di un programma AP11xxxx\n//allora compilo il payload.\n//In JN potrebbero esserci altre cose, tipo Calibration, CustomPurge , ecc...\n\nvar n = JN.includes(\"AP\")\nif (n === true) { \n \nmsg.payload = {\n a: 1301, //macchina\n DateTime: Data,\n Job : Jobs,\n Payl : Altro,\n Tempo : Seconds,\n Dot : Dots,\n Feed : Feeds,\n Strip : Strips,\n ID : MID,\n ModRev : MR,\n JobName : JN,\n NID : npcbID,\n BID : batchID,\n MB : MBN,\n Cassette : CC,\n Head : Heads\n/ ***\n L0 : Lunghezza0,\n L1 : Lunghezza1,\n L2 : Lunghezza2,\n L3 : Lunghezza3,\n L4 : Lunghezza4,\n L5 : Lunghezza5,\n L6 : Lunghezza6,\n L7 : Lunghezza7,\n L8 : Lunghezza8,\n L9 : Lunghezza9,\n L10 : Lunghezza10,\n L11 : Lunghezza11\n*** /\n}\n\n//Now we have an object with the clean values to write into DB\n//return the msg with nicely formatted data, ready to insert straight into the query {{mustach}}\nreturn msg;\n}","outputs":1,"noerr":0,"x":770,"y":620,"wires":[["31abdef8.f2bc62","89a8152a.e76ff8"]]},{"id":"8263b67c.d95168","type":"function","z":"984775e4.ae00c8","name":"transform MY700-1","func":"//store original in a msg property (for checking in debug output)\nmsg.origPayload = msg.payload;\n\nvar Data = msg.payload.Data;\nvar Altro = msg.payload.Altro;\nvar Job = Data.substr(31,15);\nvar Str1 = \"JettingFinished\";\n\nif (Job == Str1){\n//Format Data yyyy/mm/dd hh:mm:ss\nvar D = Data.substr(0,4)+'/'+Data.substr(5,2)+'/'+Data.substr(8,2)+' '+Data.substr(11,8);\n\n\nmsg.payload = {\n a: 1401,\n DateTime: D,\n JobName : Job,\n Payl : Altro\n \n}\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":570,"y":620,"wires":[["2a03c787.f3e9d8"]]},{"id":"60828592.64be6c","type":"csv","z":"984775e4.ae00c8","name":"Split Fields","sep":";","hdrin":"","hdrout":true,"multi":"one","ret":"\\n","temp":"Data, Altro","skip":"0","strings":false,"x":370,"y":620,"wires":[["8263b67c.d95168"]]},{"id":"2d3b49a0.86dae6","type":"file in","z":"984775e4.ae00c8","name":"MY700 1401","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":190,"y":620,"wires":[["60828592.64be6c"]]},{"id":"31abdef8.f2bc62","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":930,"y":680,"wires":[]},{"id":"89a8152a.e76ff8","type":"MSSQL","z":"984775e4.ae00c8","mssqlCN":"e91a56e2.a1e9f8","name":"MY700 to SQL","outField":"payload","returnType":"0","throwErrors":"0","query":" insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n articolo, \n Qta_output,\n tempo)\nVALUES ( \n 1401, @dt, @jn, 0, @tempo\n)\n","modeOpt":"","modeOptType":"query","queryOpt":"","queryOptType":"editor","paramsOpt":"queryParams","paramsOptType":"msg","params":[],"x":960,"y":580,"wires":[["38db9102.77324e"]]},{"id":"38db9102.77324e","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":1130,"y":580,"wires":[]},{"id":"4a2189ee.0c0828","type":"http in","z":"984775e4.ae00c8","name":"","url":"/ep","method":"get","upload":false,"swaggerDoc":"","x":160,"y":760,"wires":[["ace9da.69e4f628","2c71d65.8f5502a"]]},{"id":"f82b2415.d2dda8","type":"http response","z":"984775e4.ae00c8","name":"","statusCode":"","headers":{},"x":550,"y":760,"wires":[]},{"id":"ace9da.69e4f628","type":"debug","z":"984775e4.ae00c8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":290,"y":820,"wires":[]},{"id":"2c71d65.8f5502a","type":"function","z":"984775e4.ae00c8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = '\"' msg.path + \"\\\\\" + msg.payload + '\"'\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","x":360,"y":760,"wires":[["f82b2415.d2dda8"]]},{"id":"2d35441d.b4dd1c","type":"change","z":"984775e4.ae00c8","name":"","rules":[{"t":"set","p":"path","pt":"msg","to":"\\\\10.0.0.4\\C$\\LOG_MY700","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":290,"y":120,"wires":[["cf866343.44c33"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]

```

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/1/7/17e39db4fb8c3a1f720ee5848babcdb147c62e84.png)

also, please verify if you are using mssql-plus - do you see the parameters?

 ![image](https://us1.discourse-cdn.com/flex026/uploads/nodered/original/3X/e/9/e9a71358a8735ad9243097eae88e7abcacc10bd6.png)

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 20:16 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/13 "2020-11-17T20:16:55Z")

</div>

My SQL is node-red-contrib-mssql-plus 0.3.3  
Your last solution is working!  
Steve-Mcl is super! Many thanks

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 20:35 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/14 "2020-11-17T20:35:11Z")

</div>

> [@Simone](#):
>
> node-red-contrib-mssql-plus 0.3.3

that is quite old and there have been many improvements since then - including...

- the addition of parameters (Using parameters would prevent a SQL injection attacks).
- Fixed re-connection issue
- Dependencies updated

Regarding the SQL injection - if one of your CSV entries contains `105; DROP DATABASE Scambio_NAV;` you will end up in trouble.

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [17 November 2020 20:57 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/15 "2020-11-17T20:57:59Z")

</div>

Many thanks, when I'll can accept a stop of the system, I'll try to update everythings.  
Is it possible to have two or more version of Nodered on the same machine?

---

<div class="post-metadata">

**Author:** ![Steve-Mcl](https://sea2.discourse-cdn.com/flex026/user_avatar/discourse.nodered.org/steve-mcl/32/4826_2.png) [@Steve-Mcl](https://discourse.nodered.org/u/Steve-Mcl)\
**Post date:** [17 November 2020 22:32 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/16 "2020-11-17T22:32:44Z")

</div>

> [@Simone](#):
>
> Is it possible to have two or more version of Nodered on the same machine?

Yes, but its not a quick answer & has been covered on the forum a few times.

If you want to go this route, then it might be better (if you can) to use a separate PC / PI

Otherwise, post a new thread in the forum.

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [18 November 2020 21:54 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/17 "2020-11-18T21:54:33Z")

</div>

Hi Steve, I'm using the flow for another process but in this case I need to calculate delta time between two consecutive payloads. To do this, I'm trying to use global variables to store previous data... but something is wrong.  
I'm not sure to understood how to use global variables.

```auto
[{"id":"98a22fb9.cb5a","type":"file in","z":"b1118599.3545f8","name":"Apri LOG DVC","filename":"","format":"utf8","chunk":false,"sendError":false,"encoding":"none","x":360,"y":300,"wires":[["a25570de.29aed"]]},{"id":"ab3cd84c.703898","type":"change","z":"b1118599.3545f8","name":"C:\\LOG_QUADRA\\Storico","rules":[{"t":"set","p":"path","pt":"msg","to":"\\\\10.0.0.4\\c$\\LOG_QUADRA\\","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":270,"y":240,"wires":[["91d240da.015f8"]]},{"id":"91d240da.015f8","type":"fs-ops-dir","z":"b1118599.3545f8","name":"","path":"path","pathType":"msg","filter":"*.log","filterType":"str","dir":"files","dirType":"msg","x":540,"y":240,"wires":[["2c369e2e.840132"]]},{"id":"2c369e2e.840132","type":"change","z":"b1118599.3545f8","name":"copy files to payload","rules":[{"t":"set","p":"payload","pt":"msg","to":"files","tot":"msg"}],"action":"","property":"","from":"","to":"","reg":false,"x":720,"y":240,"wires":[["12df3723.658b69"]]},{"id":"7266539f.9340cc","type":"function","z":"b1118599.3545f8","name":"make filename","func":"msg.file = msg.payload;\nmsg.filename = msg.path + \"\\\\\" + msg.payload;\nreturn msg;","outputs":1,"noerr":0,"x":160,"y":300,"wires":[["98a22fb9.cb5a"]]},{"id":"12df3723.658b69","type":"split","z":"b1118599.3545f8","name":"","splt":"\\n","spltType":"str","arraySplt":1,"arraySpltType":"len","stream":false,"addname":"","x":910,"y":240,"wires":[["7266539f.9340cc"]]},{"id":"a25570de.29aed","type":"csv","z":"b1118599.3545f8","name":"Separa Campi","sep":";","hdrin":"","hdrout":false,"multi":"one","ret":"\\n","temp":"Giorno, Ora, Stato, Programma, Lotto, Scheda","skip":"0","strings":false,"x":560,"y":300,"wires":[["71d7613e.abfca"]]},{"id":"5194020f.43fdfc","type":"MSSQL","z":"b1118599.3545f8","mssqlCN":"e91a56e2.a1e9f8","name":"DVC to SQL","query":"insert into Output_Produzione (\n Centro_di_Lavoro, \n data, \n n_ord_prod, \n n_operazione, \n articolo, \n VarINT1,\n VarCHAR1,\n Tempo)\nVALUES (\n 1109,\n '{{{payload.DateTime}}}',\n '{{{payload.LottoRight5}}}',\n '{{{payload.LottoLeft4}}}',\n '{{{payload.Programma}}}',\n '{{{payload.Scheda}}}',\n '{{{payload.Stato}}}',\n '{{{payload.Tempo}}}')","outField":"payload","returnType":"0","throwErrors":"0","x":1010,"y":300,"wires":[[]]},{"id":"71d7613e.abfca","type":"function","z":"b1118599.3545f8","name":"NEW transform DVC","func":"//copy of original payload for debug output\nmsg.origPayload = msg.payload;\n\n//make a copy of the row data... in some flows doesn't work ... WHY????\n//let row = {...msg.payload};\n\nif (msg.payload.Stato == \"START\"){\n //Store Data and Lotto of the \"START\" Record to calculate delta time with the \"END\" record\n global.set (msg.payload.Ora, publicVariables.Data_START);\n global.set (msg.payload.Lotto, publicVariables.Lotto_START);\n global.set (msg.payload.Scheda, publicVariables.Scheda_START);\n}\nelse {\n \n//If any condition is false, the record is skipped\n if (msg.payload.Stato == \"END\"){\n //recall public variables\n var publicVariables = global.get(\"publicVariables\");\n\n //Check if START lotto end END Lotto are the same\n if (msg.payload.Lotto == publicVariables.Lotto_START){\n //calculate delta time using the global variable Data_START\n var Calcola_Tempo = (msg.payload.Ora - publicVariables.Data_START);\n //calculate Quantity using the global variable Scheda_START\n var Calcola_Qta = (msg.payload.Scheda - publicVariables.Scheda_START);\n\n if (msg.payload.Lotto !== undefined){\n var WO = msg.payload.Lotto.substr(5,6);\n var OP = msg.payload.Lotto.substr(0,4);\n\n if (msg.payload.Programma !== undefined){\n var Prog = 'AP11'+ msg.payload.Programma;\n \n if (msg.payload.Scheda !== undefined){\n var Sch = msg.payload.Scheda;\n \n //solo se tutti gli IF sono andati a buon fine\n //preparo il messaggio\n \n var strG = msg.payload.Giorno;\n var strO = msg.payload.Ora;\n //split Data dd/mm/yyyy hh:mm:ss\n var D = strG.substr(6,4)+'/'+strG.substr(3,2)+'/'+strG.substr(0,2)+' '+strO;\n\n msg.payload = {\n a: 1109, //not sure what this is about?\n //DateTime: formatDT(row.Giorno, row.Ora), //Call a function to make the correct DATETIME string\n DateTime: D,\n //LottoRight5 : lottoParts[1], //characters right of the '/' \n //LottoLeft4: lottoParts[0], //characters left of the '/' \n LottoRight5 : WO,\n LottoLeft4 : OP,\n Stato: Status, //add Stato to the payload\n Programma: Prog, //add Programma to the payload\n Scheda: Sch, //add Scheda to the payload\n Tempo : Calcola_Tempo,\n Qta : Calcola_Qta\n }\n }\n \n }\n }\n }\n }\n\n}\n\nreturn msg;","outputs":1,"noerr":0,"x":780,"y":300,"wires":[["2915102.0f697f"]]},{"id":"b64b201.b7b0ae","type":"inject","z":"b1118599.3545f8","name":"","topic":"","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":100,"y":160,"wires":[["69156b95.e64ca4"]]},{"id":"2915102.0f697f","type":"debug","z":"b1118599.3545f8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","x":970,"y":360,"wires":[]},{"id":"69156b95.e64ca4","type":"function","z":"b1118599.3545f8","name":"Declare Global Variables","func":"var publicVariables = {\n Data_START: \"00:00:00\",\n Lotto_START: \"0\",\n Scheda_START: \"0\"\n}\nglobal.set(\"publicVariables\", publicVariables);\nreturn msg;","outputs":1,"noerr":0,"x":340,"y":180,"wires":[["ab3cd84c.703898"]]},{"id":"e91a56e2.a1e9f8","type":"MSSQL-CN","z":"","tdsVersion":"7_4","name":"Scambio_NAV","server":"srv-dc","port":"1433","encyption":true,"database":"Scambio_NAV","useUTC":true,"connectTimeout":"90000","requestTimeout":"90000","cancelTimeout":"90000","pool":"5","parseJSON":false}]
```

---

<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:** [19 November 2020 09:54 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/18 "2020-11-19T09:54:59Z")

</div>

In your flow, everytime you press the inject button, you re-initilize the global variables. You should make that a separate flow.

You should also go read [https://nodered.org/docs/user-guide/writing-functions#storing-data](https://nodered.org/docs/user-guide/writing-functions#storing-data) and then look at your last `function` node again (it might help to [read this thread](https://discourse.nodered.org/t/a-guide-to-understanding-persistent-context/4115) too)

---

<div class="post-metadata">

**Author:** ![Simone](https://avatars.discourse-cdn.com/v4/letter/s/cab0a1/32.png) [@Simone](https://discourse.nodered.org/u/Simone)\
**Post date:** [19 November 2020 20:37 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/19 "2020-11-19T20:37:23Z")

</div>

Hi, in this case is not a problem to reinizialise the variable at each inject because I want to parse a log file made of records with  
Start.....  
Bla....  
Bla....  
End  
again  
I must calculate the execution time between Start and End so I want to store the Start Datetime and, when there is the End Record do (Date\_End - Date\_Start).  
I'm not a programmer, and JS is not so friendly for me so I'm in trouble with the definition and how to set and get data....

---

<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:** [19 November 2020 21:26 UTC](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083/20 "2020-11-19T21:26:23Z")

</div>

To set a value:

```auto
flow.set("count", 123);

```

in your `function` code you have

```auto
    global.set (msg.payload.Ora, publicVariables.Data_START);
    global.set (msg.payload.Lotto, publicVariables.Lotto_START);
    global.set (msg.payload.Scheda, publicVariables.Scheda_START);

```

so it should be  
` global.set(publicVariables.Data_START, msg.payload.Ora);`  
or  
global.set(name-of-context-variable, data-to-be-stored-in-context-variable)

[Next page](https://discourse.nodered.org/t/how-to-list-files-and-parse-them/36083.md?page=2)
