I’m new to Node, and I have a text file that has data like this
Date Open High Low Close Volume 11-Jun-19 163.3 164.54 162.74 163.1 158470476 10-Jun-19 165.31 165.4 164.37 164.8 105667060 7-Jun-19 163.85 164.95 163.14 164.8 188337725 ...
I would like to create an array of objects like this
[{ Date: "11-Jun-19", Open: 163.22, High: 164.28, Low: 163.05, Close: 163.88, Volume: 5854647 }, { Date: "12-Jun-19", Open: 163.22, High: 164.28, Low: 163.05, Close: 163.88, Volume: 5854647 }, { Date: "15-Jun-19", Open: 163.22, High: 164.28, Low: 163.05, Close: 163.88, Volume: 5854647 }]
How can I do this? This was my attempt:
const lineReader = require('line-reader'); lineReader.eachLine('input.txt', function (line) { let results = []; let divide = line.split(" "); for (let i = 0; i < divide.length; i++) { let field = divide[i].split("/t"); results.push({ date: field[0], open: field[1], high: field[2], low: field[3], close: field[4], volume: field[5] }); } console.log(results); });
But this create an array for each object and I get all the data showing under date
like this:
[ { date: '11-Jun-19t163.3t164.54t162.74t163.1t158470476', open: undefined, high: undefined, low: undefined, close: undefined, volume: undefined } ] [ { date: '10-Jun-19t165.31t165.4t164.37t164.8t105667060', open: undefined, high: undefined, low: undefined, close: undefined, volume: undefined } ] ...
Advertisement
Answer
You can try readline
internal module, by the way (see this example), if your file is big and you do need line by line processing:
const fs = require('fs'); const readline = require('readline'); async function processLineByLine() { const fileStream = fs.createReadStream('test.txt'); const rl = readline.createInterface({ input: fileStream, crlfDelay: Infinity, }); let headers = null; const data = []; for await (const line of rl) { const row = line.split(/s+/); if (headers === null) { // So this is the first line. headers = row; } else { const entry = {}; for (let i = 0; i < row.length; i++) { const header = headers[i]; const cell = row[i]; entry[header] = header === 'Date' ? cell : Number(cell); // Or more generally: // const mayBeNumber = Number(cell); // entry[header] = Number.isNaN(mayBeNumber) ? cell : mayBeNumber; } data.push(entry); } } console.log(data); } processLineByLine();