Je dois transmettre un fichier texte dans le terminal, puis en lire les données, comment puis-je faire cela?
node server.js file.txt
Comment passer le chemin depuis le terminal, comment lire cela de l'autre côté?
Je dois transmettre un fichier texte dans le terminal, puis en lire les données, comment puis-je faire cela?
node server.js file.txt
Comment passer le chemin depuis le terminal, comment lire cela de l'autre côté?
Réponses:
Vous voudrez utiliser le process.argvtableau pour accéder aux arguments de ligne de commande pour obtenir le nom de fichier et le module FileSystem (fs) pour lire le fichier. Par exemple:
// 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)
});
Pour décomposer un peu cela, vous process.argvaurez généralement une longueur de deux, l'élément zéro étant l'interpréteur "node" et le premier étant le script que le nœud est en cours d'exécution, les éléments après cela ont été passés sur la ligne de commande. Une fois que vous avez extrait un nom de fichier d'argv, vous pouvez utiliser les fonctions du système de fichiers pour lire le fichier et faire ce que vous voulez avec son contenu. Un exemple d'utilisation ressemblerait à ceci:
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[Edit] Comme le mentionne @wtfcoder, utiliser la fs.readFile()méthode " " n'est peut-être pas la meilleure idée car elle mettra en mémoire tampon tout le contenu du fichier avant de le céder à la fonction de rappel. Cette mise en mémoire tampon pourrait potentiellement utiliser beaucoup de mémoire mais, plus important encore, elle ne tire pas parti de l'une des fonctionnalités de base de node.js - les E / S asynchrones et événementielles.
La manière «nœud» de traiter un gros fichier (ou n'importe quel fichier, en réalité) serait d'utiliser fs.read()et de traiter chaque morceau disponible tel qu'il est disponible à partir du système d'exploitation. Cependant, la lecture du fichier en tant que tel vous oblige à effectuer votre propre analyse / traitement incrémentiel (éventuellement) du fichier et une certaine quantité de mise en mémoire tampon peut être inévitable.
var lines = data.split(/\r?\n/);, alors le tableau "lines" aura chaque ligne.
Utilisez fs avec 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 MON HUMBLE AVIS, fs.readFile() doit être évité car il charge TOUS les fichiers en mémoire et n'appellera pas le rappel tant que tout le fichier n'aura pas été lu.
Le moyen le plus simple de lire un fichier texte est de le lire ligne par ligne. Je recommande 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 ();
Pour les structures de données complexes telles que les fichiers .properties ou json, vous devez utiliser un analyseur syntaxique (en interne, il doit également utiliser un lecteur tamponné).
fs.readFile()ou fs.readFileSync(). Il doit s'agir d'un fichier volumineux pour provoquer une attente notable. Un fichier de configuration JSON comme package.json est susceptible d'être de moins de 1 kb, de sorte que vous pouvez juste fs.readFile()et JSON.parse()il.
Vous pouvez utiliser readstream et pipe pour lire le fichier ligne par ligne sans lire tout le fichier en mémoire une seule fois.
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.');
})
);
Je poste un exemple complet que j'ai finalement mis au travail. Ici, je lis un fichier à rooms/rooms.txtpartir d'un 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);
});