In nodejs is it possible to detect multiple occurrences of the same string in a txt file?
My current code is as below
const fs = require('fs');
var file_path = 'file.txt';
fs.readFile(file_path, "UTF-8", (error, data) => {
if (error) throw error;
else {
if (data.includes('Test Value')) {
console.log(data.indexOf('Test Value'))
}
fs.close(file, (err) => {
if (err)
console.error('Failed to close file', err);
else {
console.log("\n> File Closed successfully");
}
});
}
});
In file.txt, I have below contents
Value1
Value2
Test Value
Value3
Test Value
Value4
when I run the above code, I could only detect first occurrence of 'Test Value' whereas I need to detect all occurrences of 'Test Value' in file.txt, please help
CodePudding user response:
indexOf
has two parameters. You can use store the last position and continue the next search at the next position:
const fs = require('fs');
var file_path = 'file.txt';
fs.readFile(file_path, "UTF-8", (error, data) => {
if (error) throw error;
else {
for (let pos = data.indexOf('Test Value'); pos > -1; pos = data.indexOf('Test Value', pos 1)) {
console.log(pos);
}
fs.close(file, (err) => {
if (err)
console.error('Failed to close file', err);
else {
console.log("\n> File Closed successfully");
}
});
}
});
Example:
const data = `Value1
Value2
Test Value
Value3
Test Value
Value4`;
for (let pos = data.indexOf('Test Value'); pos > -1; pos = data.indexOf('Test Value', pos 1)) {
console.log(pos);
}
CodePudding user response:
You can use a regexp global search (multiple matches) with the RegExp .exec()
method.
A global search using the String .match()
method returns just the matches without the index. However the RegExp .exec()
method returns the index.
let match;
let search = /Test Value/g; // <-- the 'g' flag is important!
// If you need to construct the regexp dynamically
// do = new RegExp('Test Value', 'g')
while (match = search.exec(data)) {
console.log(match.index);
}
CodePudding user response:
I used an array to store occurrences (line number) of a particular string in a file.
var linepos = [];
fs.readFile(file_name, "UTF-8", (error, data) => {
if (error) throw error;
else {
let pos = 0;
data.split(/\r?\n/).forEach(line => {
if (line == 'Test Value') {
//console.log(pos)
linepos.push(pos);
}
pos = pos 1
});
}
});
and then used this array to perform other operations such as append etc with foreach
linepos.forEach((item) => {
//operations body
});
CodePudding user response:
Yes. Loop through the data
array and check each data element.
const fs = require('fs');
var file_path = 'file.txt';
fs.readFile(file_path, "UTF-8", (error, data) => {
if (error) throw error;
else {
data.split('\n').forEach(line => {
if (line === 'Test Value') {
console.log(data.indexOf(line))
}
})
fs.close(file, (err) => {
if (err)
console.error('Failed to close file', err);
else {
console.log("\n> File Closed successfully");
}
});
}
});