Чтение текстового файла с помощью узла.Джей?



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



node server.js file.txt


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

420   5  

5 ответов:

вы хотите использовать process.argv массив для доступа к аргументам командной строки, чтобы получить имя файла и модуль файловой системы (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()" метод не может быть лучшей идеей, потому что он будет буферизовать все содержимое файла, прежде чем передать его функции обратного вызова. Эта буферизация потенциально может использовать много памяти, но, что более важно, она не использует одну из основных функций узла.js - асинхронный, evented I / O.

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

ИМХО, 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 ();

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

вы можете использовать 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.');
    })
);

я публикую полный пример, который я, наконец, получил работу. Вот я читаю в файле 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);
});

Usign fs с узлом.

var fs = require('fs');

try {  
    var data = fs.readFileSync('file.txt', 'utf8');
    console.log(data.toString());    
} catch(e) {
    console.log('Error:', e.stack);
}

Comments

    Ничего не найдено.