Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Nodejs Convert text to JSON

For some reason I'm having such a hard time converting this txt file to an actual javascript array.

myJson.txt

{"action": "key press", "timestamp": 1523783621, "user": "neovim"}
{"action": "unlike", "timestamp": 1523784584, "user": "r00k"}
{"action": "touch", "timestamp": 1523784963, "user": "eevee"}
{"action": "report as spam", "timestamp": 1523786005, "user": "moxie"}

Currently what I have that doesn't work

const fs = require('fs');

function convert(input_file_path) {
    const file = fs.readFileSync(input_file_path, 'utf8');
    const newFormat = file
      .replace(/(\r\n\t|\n|\r\t)/gm,'')
      .replace(/}{/g, '},{');

    console.log([JSON.parse(newFormat)]);
}

convert('myJson.txt');
like image 674
Victor Le Avatar asked Jan 28 '23 08:01

Victor Le


2 Answers

Since your file contains a JSON object per line, you could read that file line by line, using readline.

Each line is then parsed, and push into an array, which is then returned (resolved) after the file is fully read.

'use strict';

const fs = require('fs');
const readline = require('readline');

function convert(file) {

    return new Promise((resolve, reject) => {

        const stream = fs.createReadStream(file);
        // Handle stream error (IE: file not found)
        stream.on('error', reject);

        const reader = readline.createInterface({
            input: stream
        });

        const array = [];

        reader.on('line', line => {
            array.push(JSON.parse(line));
        });

        reader.on('close', () => resolve(array));
    });
}


convert('myJson.txt')
    .then(res => {
        console.log(res);
    })
    .catch(err => console.error(err));
like image 93
Marcos Casagrande Avatar answered Jan 31 '23 07:01

Marcos Casagrande


I would have done this in this way

var fs = require('fs');
var readline = require('readline');
var array = [];
var input = null;
var rd = readline.createInterface({
    input: fs.createReadStream(__dirname+'/demo.txt')
    
});

rd.on('line', function(line) {
    array.push(JSON.parse(line));
});
rd.on('close', function(d){
  array.forEach(e=>console.log(e.action))
})

What's happening here is, I am reading the lines of the file on by one using readline which is one of the core modules of nodejs. Listening on the events and doing what needed.

And yeah, you'll have to parse the line to JSON for sure ;)

Thanks

like image 32
Muhammad Usman Avatar answered Jan 31 '23 09:01

Muhammad Usman