У меня проблема в NodeJS с обработкой файлов

#javascript #node.js #logic #file-handling

#javascript #node.js #Логические #обработка файлов

Вопрос:

Я не могу решить следующую проблему с обработкой файлов в NodeJS: у меня есть файл emp.txt который содержит данные сотрудника в фиксированном размере записи в следующем формате:

     EmpID:Name:Dept:Salary
    1001:Harry:Sales:23000
    1002:Sarita:Accounts:20000
    1003:Monika:TechSupport:35000
    Read the file. Display sum of salary of all employees
 

Я попытался выполнить следующий код для успешного чтения файла, но не получил логики для решения точной проблемы. Мой код для чтения файла:

     var fs = require("fs");
    console.log("Going to read file!");

    fs.readFile('emp.txt', function(err, data){
        if(err){
            return console.error(err);
        }
        console.log(data.toString().split(":"));
        console.log("read Successfully");
    })
 

Какова правильная логика для чтения Salary поля emp.txt и вычисления его суммы?

Ответ №1:

Сначала вам нужно разделить новые строки ( n ) в вашем текстовом файле. Затем выполните цикл по каждой строке и получите общее:

 var fs = require("fs");
console.log("Going to read file!");

let totalSalary = 0;
fs.readFile('emp.txt', function(err, data){
    if(err){
        return console.error(err);
    }
    const dataRows = data.toString().split("n");
    for (let index=0;  index < dataRows.length; index  ){
      if (index > 0){
        let empData = dataRows[index].split(":");
        totalSalary  = parseInt(empData[3]);
      }
    }

    console.log(totalSalary);

    console.log("read Successfully");
})
 

Repl.it Ссылка : https://repl.it/@h4shonline/ImpressionableRadiantLogic

Комментарии:

1. ! О, хорошо, понял! Сработало очень хорошо для меня, спасибо за помощь!

Ответ №2:

Почему вы не:

Что-то вроде этого:

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

async function processLineByLine() {
    const fileStream = fs.createReadStream('emp.txt');
  
    const rl = readline.createInterface({
      input: fileStream,
      crlfDelay: Infinity
    });
    // Note: we use the crlfDelay option to recognize all instances of CR LF
    // ('rn') in input.txt as a single line break.
    let sum = 0;
    for await (let line of rl) {
      // Each line in input.txt will be successively available here as `line`.
      line = line.replace(/ /g,'').split(':');
      const salary = Number(line.pop());
      if (!isNaN(salary)) {
        sum  = salary;
      }
    }
    console.log(`Sum: ${sum}`)
  }

  processLineByLine();
 

Комментарии:

1. ! Этот ответ тоже сработал очень хорошо. Но, я думаю, вы использовали немного сложную логику. Спасибо вам за помощь!