Читать текстовый файл, используя Node.js? - PullRequest
97 голосов
/ 07 февраля 2012

Мне нужно передать текстовый файл в терминал, а затем прочитать данные из него, как я могу это сделать?

node server.js file.txt

Как мне пройти по пути от терминала, как сделатьЯ прочитал это на другой стороне?

Ответы [ 5 ]

153 голосов
/ 07 февраля 2012

Вы захотите использовать массив process.argv для доступа к аргументам командной строки, чтобы получить имя файла, и модуль FileSystem (fs) для чтения файла. Например:

// Make sure we got a filename on the command line.
if (process.argv.length < 3) {
  console.log('Usage: node ' + process.argv[1] + ' FILENAME');
  process.exit(1);
}
// Read the file and print its contents.
var fs = require('fs')
  , filename = process.argv[2];
fs.readFile(filename, 'utf8', function(err, data) {
  if (err) throw err;
  console.log('OK: ' + filename);
  console.log(data)
});

Чтобы немного разбить это для вас, process.argv обычно будет иметь длину два, нулевой элемент - интерпретатор "узла", а первый - скрипт, который в данный момент выполняется узлом, элементы после которого были переданы в командной строке. , После того, как вы извлекли имя файла из argv, вы можете использовать функции файловой системы, чтобы прочитать файл и делать с его содержимым все, что вы хотите. Пример использования будет выглядеть так:

$ node ./cat.js file.txt
OK: file.txt
This is file.txt!

[Edit] Как упоминает @wtfcoder, использование метода "fs.readFile()" может быть не самой лучшей идеей, поскольку он буферизует все содержимое файла перед передачей его в функцию обратного вызова. Эта буферизация может потенциально использовать много памяти, но, что более важно, она не использует одну из основных функций node.js - асинхронный, четный ввод-вывод.

«Узловой» способ обработки большого файла (или любого другого файла на самом деле) заключается в использовании fs.read() и обработке каждого доступного фрагмента так, как он доступен из операционной системы. Однако чтение файла как такового требует от вас собственного (возможно) инкрементального синтаксического анализа / обработки файла, и некоторая степень буферизации может быть неизбежной.

25 голосов
/ 26 апреля 2012

ИМХО, fs.readFile() следует избегать, поскольку он загружает ВСЕ файл в память и не вызывает обратный вызов, пока не будет прочитан весь файл.

Самый простой способ прочитать текстовый файл - эточитать это построчно.Я рекомендую BufferedReader :

new BufferedReader ("file", { encoding: "utf8" })
    .on ("error", function (error){
        console.log ("error: " + error);
    })
    .on ("line", function (line){
        console.log ("line: " + line);
    })
    .on ("end", function (){
        console.log ("EOF");
    })
    .read ();

Для сложных структур данных, таких как файлы .properties или json, вам необходимо использовать синтаксический анализатор (внутренне он также должен использовать буферизованный читатель).

16 голосов
/ 19 сентября 2018

Назначить фс с узлом.

var fs = require('fs');

try {  
    var data = fs.readFileSync('file.txt', 'utf8');
    console.log(data.toString());    
} catch(e) {
    console.log('Error:', e.stack);
}
4 голосов
/ 18 октября 2017

Я публикую полный пример, который наконец заработал.Вот читаю в файле rooms/rooms.txt из скрипта rooms/rooms.js

var fs = require('fs');
var path = require('path');
var readStream = fs.createReadStream(path.join(__dirname, '../rooms') + '/rooms.txt', 'utf8');
let data = ''
readStream.on('data', function(chunk) {
    data += chunk;
}).on('end', function() {
    console.log(data);
});
4 голосов
/ 28 сентября 2017

Вы можете использовать readstream и pipe для построчного чтения файла, не считывая весь файл в память один раз.

var fs = require('fs'),
    es = require('event-stream'),
    os = require('os');

var s = fs.createReadStream(path)
    .pipe(es.split())
    .pipe(es.mapSync(function(line) {
        //pause the readstream
        s.pause();
        console.log("line:", line);
        s.resume();
    })
    .on('error', function(err) {
        console.log('Error:', err);
    })
    .on('end', function() {
        console.log('Finish reading.');
    })
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...