Devo passare un file di testo nel terminale e poi leggere i dati da esso, come posso farlo?
node server.js file.txt
Come passo il percorso dal terminale, come leggo quello dall'altra parte?
Devo passare un file di testo nel terminale e poi leggere i dati da esso, come posso farlo?
node server.js file.txt
Come passo il percorso dal terminale, come leggo quello dall'altra parte?
Risposte:
Ti consigliamo di utilizzare l' process.argvarray per accedere agli argomenti della riga di comando per ottenere il nome del file e il modulo FileSystem (fs) per leggere il file. Per esempio:
// 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)
});
Per process.argvscomporlo un po 'per te di solito avrai lunghezza due, l'elemento zero è l'interprete del "nodo" e il primo è lo script che il nodo sta attualmente eseguendo, gli elementi successivi sono stati passati sulla riga di comando. Dopo aver estratto un nome di file da argv, puoi usare le funzioni del file system per leggere il file e fare quello che vuoi con il suo contenuto. L'utilizzo del campione sarebbe simile a questo:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Modifica] Come menzionato da @wtfcoder, l'utilizzo del fs.readFile()metodo " " potrebbe non essere l'idea migliore perché bufferizzerà l'intero contenuto del file prima di cederlo alla funzione di callback. Questo buffering potrebbe potenzialmente utilizzare molta memoria ma, cosa più importante, non sfrutta una delle funzionalità principali di node.js: I / O asincrono con eventi.
Il modo "nodo" per elaborare un file di grandi dimensioni (o qualsiasi file, in realtà) sarebbe quello di utilizzare fs.read()ed elaborare ogni blocco disponibile così come è disponibile dal sistema operativo. Tuttavia, la lettura del file in quanto tale richiede di eseguire la propria (possibilmente) analisi / elaborazione incrementale del file e una certa quantità di buffering potrebbe essere inevitabile.
var lines = data.split(/\r?\n/);, quindi l'array "lines" avrà ogni riga.
Usa fs con node.
var fs = require('fs');
try {
var data = fs.readFileSync('file.txt', 'utf8');
console.log(data.toString());
} catch(e) {
console.log('Error:', e.stack);
}
A PARER MIO, fs.readFile() dovrebbe essere evitato perché carica TUTTO il file in memoria e non chiamerà il callback fino a quando tutto il file non sarà stato letto.
Il modo più semplice per leggere un file di testo è leggerlo riga per riga. Consiglio un 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 ();
Per strutture di dati complesse come .properties o file json è necessario utilizzare un parser (internamente dovrebbe anche utilizzare un lettore bufferizzato).
fs.readFile()o fs.readFileSync(). Deve essere un file enorme per causare un'attesa notevole. Un JSON file di configurazione come package.json è probabile che sia inferiore a 1 kb, quindi si può semplicemente fs.readFile()ed JSON.parse()esso.
È possibile utilizzare readstream e pipe per leggere il file riga per riga senza leggere tutto il file in memoria una volta.
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.');
})
);
Sto postando un esempio completo che finalmente ho ottenuto lavorando. Qui sto leggendo in un file rooms/rooms.txtda uno 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);
});