In Node.js, how to read a file, append a string at a specified line or delete a string from a certain line? - node.js

I need to open an existing JavaScript file, check if this string exists:
var LocalStrategy = require('passport-local').Strategy;
If it doesn't, then append it at the top with the rest of require() lines.
In another case, I need to check if that string exists, and if it does, I would like to remove just that line.
I have looked at fs.readFile, fs.writeFile, fs.open but I don't think it is capable of doing what I need. Any suggestions?

This is a simplified script:
var fs = require('fs');
var search = "var LocalStrategy = require('passport-local').Strategy;";
function append (line) {
line = line || 0;
var body = fs.readFileSync('example.js').toString();
if (body.indexOf(search) < 0 ) {
body = body.split('\n');
body.splice(line + 1,0,search);
body = body.filter(function(str){ return str; }); // remove empty lines
var output = body.join('\n');
fs.writeFileSync('example.js', output);
}
}
function remove () {
var body = fs.readFileSync('example.js').toString();
var idx = body.indexOf(search);
if (idx >= 0 ) {
var output = body.substr(0, idx) + body.substr(idx + search.length);
fs.writeFileSync('example.js', output);
}
}

Related

trying to extract pdf data into json format with headers and paragraphs as nested child

I am trying to extract pdf data to json format like below using in adobe pdf extract api,
this is the json I am getting
I want it to be something like this
Tried lots of solution with nested approach but can't figure out a proper way.
I have tried a nested approach but it didn't give proper solution
here is code
`
const fs = require("fs");
// Read the JSON file
const jsonString = fs.readFileSync("structuredData.json", "utf8");
// Parse the JSON string into an object
const data = JSON.parse(jsonString);
// Initialize the output object
const output = {};
// Loop through each line in the data
data.elements.forEach((line) => {
// Get the path and text values
const path = line.Path;
const text = line.Text;
// Split the path into an array
const pathParts = path.split("/");
// Initialize the current object to be the output object
let current = output;
let prev = null;
// Loop through each part of the path
pathParts.forEach((part, index) => {
// If this is the last part of the path, set the text as the value
if (index === pathParts.length - 1) {
if (Object.keys(current)[0]) {
prevdata = current[Object.keys(current)[0]];
current[Object.keys(current)[0]] = { ...prevdata, [text]: {} };
} else [(current[text] = {})];
} else {
// If the current object doesn't have a property with this path part, create it
if (!current[part]) {
current[part] = {};
}
// Set the current object to be the nested object
current = current[part];
}
});
});
// Convert the output object to a JSON string and write it to a file
fs.writeFileSync("output.json", JSON.stringify(output));
`

take an array and return its items, line by line

im trying to take an array and make it line by line, and write it in a new text file using writefilesync, for example: const arr = [1,2,3], in the text file it should show:
a
b
c
const fs = require ('fs');
const tip = [1,2,3]
for (let i =0; i < tip.length; i ++) {
tip[i] = tip[i] + "<br / >";
return tip;
}
let textFile = fs.writeFileSync ('text.txt', tip, 'utf8');
the result in the text file should be line by line
1
2
3
You are almost there, try with this one:
const fs = require ('fs');
const tip = [1,2,3];
const result = tip.join('\n');
let textFile = fs.writeFileSync ('text.txt', result, 'utf8');
Here, you are creating a string from the array by joining each element using a \n sign, which represents a newline.
The error in your code was that you were adding <br /> tag to break the lines, which is an HTML tag and it would work only in the browser but not in a regular file.
Using for-loop, the above would look like this:
const fs = require ('fs');
const tip = [1,2,3];
let result = '';
for (let i = 0; i < tip.length; i++) {
result += tip[i] + '\n';
}
let textFile = fs.writeFileSync ('text.txt', result, 'utf8');

Need to write an array of objects to a file from nodejs

I have an array of objects like below that i have to write to a file with node js, the aim is to write one item per line into one file :
cont obj = [{a:1},{b:2}]
Output file content expected :
//file.json
{a:1}
{b:2}
My code without success
jsonfile.writeFileSync(filePath, JSON.stringify(obj), 'utf-8');
/*
* [\{a:1\},\{b:2\}] <=== a string in one line with special characters
* doesn't fit on my need
*/
If someone could helps me,
Thank you.
You could simply:
const text = arr.map(JSON.stringify).reduce((prev, next) => `${prev}\n${next}`);
fs.writeFileSync(filePath, text, 'utf-8');
(That's a slight modification of #ronapelbaum approach)
You can use util.inspect and loop.
const arr = [{a:1}, {b:2}];
const filePath = "path/to/json";
for (let obj of arr)
fs.appendFileSync (filePath, util.inspect (obj) + "\n")
Or, if you'd like to accumulate the data to save on write operations:
const arr = [{a:1}, {b:2}];
const data = arr.reduce ((a, b) => a + util.inspect (b) + "\n", "");
const filePath = "path/to/json";
fs.writeFileSync (filePath, data);
The final file will fit your requirements:
{ a: 1 }
{ b: 2 }
when you're using the jsonfile library, you don't need to use JSON.stringify(obj).
in your case, you don't really want to write a valid json...
consider this:
const text = arr.reduce((txt, cur) => txt + '\n' + JSON.stringify(cur), '');
fs.writeFileSync(filePath, text, 'utf-8');

How to make an array in new file from a list of items

I have a file with a list of words like this
add
blah
blahblah
undo
In other words, there's whitespace at the beginning of some of the lines.
Using node.js, I'm doing this to remove the whitespace (which works fine)
var fs = require('fs')
var array = fs.readFileSync(myfile.txt).toString().split("\n");
for(i in array){
var k = array[i].trim();
console.log(k);
}
but I would like to put the result in a new file like this
newfile.txt
var arr = ["add", "blah", "blahblah"];
Question: How to make an array in new file from a list of items
var fs = require('fs')
var inLines = fs.readFileSync('in.txt').toString().split("\n");
var trimmed = inLines.map(function (line) {
return line.trim();
});
// remove any blank lines
var noEmpties = trimmed.filter(function (line) {
return line;
});
var newData = 'var arr = ' + JSON.stringify(noEmpties) + ';\n'
fs.writeFileSync('newfile.txt', newData, 'utf8');

Write a line into a .txt file with Node.js

I want to use Node.js to create a simple logging system which prints a line before the past line into a .txt file. However, I don't know how the file system functionality from Node.js works.
Can someone explain it?
Inserting data into the middle of a text file is not a simple task. If possible, you should append it to the end of your file.
The easiest way to append data some text file is to use build-in fs.appendFile(filename, data[, options], callback) function from fs module:
var fs = require('fs')
fs.appendFile('log.txt', 'new data', function (err) {
if (err) {
// append failed
} else {
// done
}
})
But if you want to write data to log file several times, then it'll be best to use fs.createWriteStream(path[, options]) function instead:
var fs = require('fs')
var logger = fs.createWriteStream('log.txt', {
flags: 'a' // 'a' means appending (old data will be preserved)
})
logger.write('some data') // append string to your file
logger.write('more data') // again
logger.write('and more') // again
Node will keep appending new data to your file every time you'll call .write, until your application will be closed, or until you'll manually close the stream calling .end:
logger.end() // close string
Note that logger.write in the above example does not write to a new line. To write data to a new line:
var writeLine = (line) => logger.write(`\n${line}`);
writeLine('Data written to a new line');
Simply use fs module and something like this:
fs.appendFile('server.log', 'string to append', function (err) {
if (err) return console.log(err);
console.log('Appended!');
});
Step 1
If you have a small file
Read all the file data in to memory
Step 2
Convert file data string into Array
Step 3
Search the array to find a location where you want to insert the text
Step 4
Once you have the location insert your text
yourArray.splice(index,0,"new added test");
Step 5
convert your array to string
yourArray.join("");
Step 6
write your file like so
fs.createWriteStream(yourArray);
This is not advised if your file is too big
I created a log file which prints data into text file using "Winston" logger. The source code is here below,
const { createLogger, format, transports } = require('winston');
var fs = require('fs')
var logger = fs.createWriteStream('Data Log.txt', {
flags: 'a'
})
const os = require('os');
var sleep = require('system-sleep');
var endOfLine = require('os').EOL;
var t = ' ';
var s = ' ';
var q = ' ';
var array1=[];
var array2=[];
var array3=[];
var array4=[];
array1[0] = 78;
array1[1] = 56;
array1[2] = 24;
array1[3] = 34;
for (var n=0;n<4;n++)
{
array2[n]=array1[n].toString();
}
for (var k=0;k<4;k++)
{
array3[k]=Buffer.from(' ');
}
for (var a=0;a<4;a++)
{
array4[a]=Buffer.from(array2[a]);
}
for (m=0;m<4;m++)
{
array4[m].copy(array3[m],0);
}
logger.write('Date'+q);
logger.write('Time'+(q+' '))
logger.write('Data 01'+t);
logger.write('Data 02'+t);
logger.write('Data 03'+t);
logger.write('Data 04'+t)
logger.write(endOfLine);
logger.write(endOfLine);
function mydata() //user defined function
{
logger.write(datechar+s);
logger.write(timechar+s);
for ( n = 0; n < 4; n++)
{
logger.write(array3[n]);
}
logger.write(endOfLine);
}
var now = new Date();
var dateFormat = require('dateformat');
var date = dateFormat(now,"isoDate");
var time = dateFormat(now, "h:MM:ss TT ");
var datechar = date.toString();
var timechar = time.toString();
mydata();
sleep(5*1000);

Resources