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


124

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

node server.js file.txt

터미널에서 경로를 어떻게 전달합니까? 다른 쪽에서 어떻게 읽습니까?


명령 줄에 더 많은 옵션을 추가하는 경우 Optimist 를 사용할 수 있습니다 .
Jess

stackoverflow.com/questions/6156501/... 쇼에게 텍스트 파일을 읽을 수있는 또 다른 방법
마크 Durdin

답변:


172

당신은 사용할 수 있습니다 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()은 운영 체제에서 사용 가능한 각 청크 를 사용 하고 처리하는 것입니다. 그러나 파일을 그렇게 읽으려면 파일에 대한 (아마도) 증분 파싱 / 처리를 수행해야하며 어느 정도의 버퍼링이 불가피 할 수 있습니다.


정말 감사합니다. 매우 도움이되었습니다. 이 데이터를 줄별로 어떻게 나눌 수 있습니까?
멋진

10
@fancy : try var lines = data.split(/\r?\n/);, 그러면 배열 "lines"에 각 행이 있습니다.
maerics

1
텍스트 파일이 큰 경우에는 모두 메모리로 읽혀 지므로 1000MB CSV 파일을 fs.createFilestream에서 살펴보면 처리하는 경우 데이터 청크처럼 줄 분할에주의해야합니다. 선 경계에 늘 (대부분의 경우) 가을 (어떤 사람들은 이미 해결책을 함께 한 - 구글)
맷 프리먼

1
@wtfcoder : 예, 아주 좋은 지적입니다. 내 의도는 명령 줄에 이름이 지정된 파일을 읽는 간단한 경우를 보여주기위한 것이 었습니다. 이 질문의 범위를 벗어난 미묘함 (특히 성능)이 분명히 많습니다.
maerics 2012

동기식 스트림을 사용하여 매우 큰 파일을 구문 분석하는 유사한 질문에 대한 솔루션을 게시했습니다. 참조 : stackoverflow.com/questions/16010915/…
Gerard

35

노드가있는 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);
}

이것은 동기 버전입니다.
Rich Werden

@RichWerden이 맥락에서 "동기"란 무엇을 의미합니까?
Json

1
노드에서 무언가가 "동기화"되면 시스템이 다른 작업을 수행하는 것을 중지 / 차단합니다. 노드 웹 서버가 있다고 가정 해 보겠습니다. 위와 같은 상황이 발생하는 동안 다른 요청이 들어 오면 서버는 파일을 읽는 중이므로 응답하지 않거나 응답 할 수 없습니다.
Rich Werden

27

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 파일과 같은 복잡한 데이터 구조의 경우 구문 분석기를 사용해야합니다 (내부적으로 버퍼 된 판독기도 사용해야 함).


7
이 기술을 지적 해 주셔서 감사합니다. 이것이 최선의 방법이라는 것은 맞지만,이 질문의 맥락에서 약간 혼란 스럽다고 생각했습니다. 위에서 지적했듯이 명령 줄 도구에 전달되는 작은 파일 인 경우 fs.readFile()또는 .NET을 사용하지 않을 이유가 없습니다 fs.readFileSync(). 눈에 띄게 기다리려면 거대한 파일이어야합니다. package.json 같은 JSON 구성 파일이 1킬로바이트에서 할 가능성이 높습니다 그래서 당신은 단지 수 fs.readFile()JSON.parse()그것.
John Starr Dewar

1
BufferedReader가 서명을 변경했을 수 있습니다. BufferedReader를 BufferedReader, DataReader로 교체해야했습니다. 여기서 BufferedReader가 모듈이었습니다. 참조 github.com/Gagle/Node-BufferedReader
bnieland

13
BufferedReader가 이제 더 이상 사용되지 않는 것을 확인했습니다.
Marc Rochkind

6

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

5

마침내 작업 한 완전한 예제를 게시하고 있습니다. 여기 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);
});
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.