터미널에 텍스트 파일을 전달한 다음 데이터를 읽어야합니다. 어떻게해야합니까?
node server.js file.txt
터미널에서 경로를 어떻게 전달합니까? 다른 쪽에서 어떻게 읽습니까?
답변
당신은 사용할 수 있습니다 process.argv
파일 이름과 얻기 위해 명령 줄 인수에 액세스하는 배열을 파일 시스템 모듈 (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
나누면 보통 길이 2가됩니다. 0 번째 항목은 “노드”인터프리터이고 첫 번째 항목은 노드가 현재 실행중인 스크립트이며 그 이후의 항목은 명령 줄에 전달됩니다. argv에서 파일 이름을 가져 오면 파일 시스템 함수를 사용하여 파일을 읽고 원하는 내용을 수행 할 수 있습니다. 샘플 사용법은 다음과 같습니다.
$ node ./cat.js file.txt
OK: file.txt
This is file.txt!
[편집] @wtfcoder가 언급했듯이 ” fs.readFile()
“메서드를 사용하는 것은 파일을 콜백 함수에 양보하기 전에 파일의 전체 내용을 버퍼링하므로 최선의 방법이 아닐 수 있습니다. 이 버퍼링은 잠재적으로 많은 메모리를 사용할 수 있지만 더 중요한 것은 node.js의 핵심 기능 중 하나 인 비동기 이벤트 I / O를 활용하지 않는다는 것입니다.
큰 파일 (또는 모든 파일)을 처리하는 “노드”방식 fs.read()
은 운영 체제에서 사용 가능한 각 청크 를 사용 하고 처리하는 것입니다. 그러나 파일을 그렇게 읽으려면 파일에 대한 (아마도) 증분 파싱 / 처리를 수행해야하며 어느 정도의 버퍼링이 불가피 할 수 있습니다.
답변
노드가있는 Usign 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 파일과 같은 복잡한 데이터 구조의 경우 구문 분석기를 사용해야합니다 (내부적으로 버퍼 된 판독기도 사용해야 함).
답변
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);
});