[javascript] Node.js를 사용하여 텍스트 파일을 읽으시겠습니까?

터미널에 텍스트 파일을 전달한 다음 데이터를 읽어야합니다. 어떻게해야합니까?

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);
});


답변