Мені потрібно передати текстовий файл у терміналі, а потім прочитати дані з нього, як це зробити?
node server.js file.txt
Як мені пройти шлях від терміналу, як прочитати це з іншого боку?
Мені потрібно передати текстовий файл у терміналі, а потім прочитати дані з нього, як це зробити?
node server.js file.txt
Як мені пройти шлях від терміналу, як прочитати це з іншого боку?
Відповіді:
Ви хочете використовувати 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!
[Редагувати] Як згадує @wtfcoder, використання " fs.readFile()" методу може бути не найкращою ідеєю, оскільки воно буде буферувати весь вміст файлу, перш ніж передати його функції зворотного виклику. Ця буферизація може потенційно використовувати багато пам'яті, але, що ще важливіше, вона не використовує одну з основних особливостей node.js - асинхронний, парний введення / виведення.
Способом "вузла" для обробки великого файлу (або будь-якого файлу, справді) було б використання fs.read()та обробка кожного доступного фрагмента, як це доступно в операційній системі. Однак читання файлу як такого вимагає зробити власний (можливо) поступовий аналіз / обробку файлу та деяку кількість буферизації може бути неминучим.
var lines = data.split(/\r?\n/);, тоді масив "рядки" матиме кожен рядок.
Призначте fs з вузлом.
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()слід уникати, оскільки він завантажує ВСІЙ файл у пам'ять, і він не буде викликати зворотний виклик, поки не буде прочитаний весь файл.
Найпростіший спосіб прочитати текстовий файл - це прочитати його за рядком. Я рекомендую 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 файли, потрібно використовувати аналізатор (внутрішньо він також повинен використовувати буферизований зчитувач).
fs.readFile()або fs.readFileSync(). Має бути величезний файл, щоб викликати помітне очікування. Конфігураційний файл JSON, як package.json, швидше за все, буде менше 1 кб, тож ви можете просто fs.readFile()і JSON.parse()це.
Ви можете використовувати 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);
});