Preciso passar um arquivo de texto no terminal e depois ler os dados dele, como posso fazer isso?
node server.js file.txt
Como faço para passar o caminho do terminal, como faço para ler isso do outro lado?
Preciso passar um arquivo de texto no terminal e depois ler os dados dele, como posso fazer isso?
node server.js file.txt
Como faço para passar o caminho do terminal, como faço para ler isso do outro lado?
Respostas:
Você vai querer usar o process.argvarray para acessar os argumentos da linha de comando para obter o nome do arquivo e o módulo FileSystem (fs) para ler o arquivo. Por exemplo:
// 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)
});
Para quebrar isso um pouco, você process.argvnormalmente terá o comprimento dois, o item zero sendo o interpretador de "nó" e o primeiro sendo o script que o nó está executando no momento, itens depois disso foram passados na linha de comando. Depois de obter um nome de arquivo do argv, você pode usar as funções do sistema de arquivos para ler o arquivo e fazer o que quiser com seu conteúdo. O uso de amostra ficaria assim:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Editar] Como @wtfcoder menciona, usar o fs.readFile()método " " pode não ser a melhor ideia porque ele armazenará em buffer todo o conteúdo do arquivo antes de submetê-lo à função de retorno de chamada. Esse armazenamento em buffer poderia potencialmente usar muita memória, mas, mais importante, ele não tira proveito de um dos principais recursos do node.js - E / S assíncrona com eventos.
A maneira de "nó" de processar um arquivo grande (ou qualquer arquivo, na verdade) seria usar fs.read()e processar cada pedaço disponível conforme ele está disponível no sistema operacional. No entanto, ler o arquivo como tal requer que você faça sua própria (possivelmente) análise / processamento incremental do arquivo e alguma quantidade de buffer pode ser inevitável.
var lines = data.split(/\r?\n/);, então o array "linhas" terá cada linha.
Use fs com nó.
var fs = require('fs');
try {
var data = fs.readFileSync('file.txt', 'utf8');
console.log(data.toString());
} catch(e) {
console.log('Error:', e.stack);
}
IMHO, fs.readFile()deve ser evitado porque carrega TODOS os arquivos na memória e não chamará o retorno de chamada até que todo o arquivo seja lido.
A maneira mais fácil de ler um arquivo de texto é lê-lo linha por linha. Eu recomendo um 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 ();
Para estruturas de dados complexas como .properties ou arquivos json, você precisa usar um analisador (internamente, também deve usar um leitor de buffer).
fs.readFile()ou fs.readFileSync(). Deve ser um arquivo enorme para causar uma espera perceptível. Um arquivo de configuração JSON como package.json é provável que seja menos de 1 kb, então você pode apenas fs.readFile()e JSON.parse()ele.
Você pode usar readstream e pipe para ler o arquivo linha por linha sem ler todo o arquivo na memória uma vez.
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.');
})
);
Estou postando um exemplo completo que finalmente consegui funcionar. Aqui estou lendo um arquivo rooms/rooms.txtde um scriptrooms/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);
});