Мне нужно передать текстовый файл в терминал, а затем прочитать из него данные, как я могу это сделать?
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!
[Edit] Как упоминает @wtfcoder, использование fs.readFile()метода " " может быть не лучшей идеей, потому что он буферизует все содержимое файла перед передачей его функции обратного вызова. Эта буферизация потенциально может использовать много памяти, но, что более важно, она не использует одну из основных функций node.js - асинхронный, равномерный ввод-вывод.
"Узловой" способ обработки большого файла (или любого другого файла на самом деле) будет заключаться в использовании fs.read()и обработке каждого доступного фрагмента, поскольку он доступен из операционной системы. Однако чтение файла как такового требует от вас выполнения собственного (возможно) инкрементного синтаксического анализа / обработки файла, и некоторое количество буферизации может оказаться неизбежным.
var lines = data.split(/\r?\n/);, тогда в массиве "строк" будет каждая строка.
Используйте fs с node.
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()это.
Вы можете использовать поток чтения и конвейер, чтобы читать файл построчно, не считывая весь файл в память за один раз.
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);
});