[javascript] node.js에서 한 번에 한 줄씩 파일을 읽습니까?

한 번에 한 줄씩 큰 파일을 읽으려고합니다. Quora 에서 주제를 다루는 질문을 찾았 지만 모든 것을 함께 사용할 수있는 연결이 누락되었습니다.

 var Lazy=require("lazy");
 new Lazy(process.stdin)
     .lines
     .forEach(
          function(line) {
              console.log(line.toString());
          }
 );
 process.stdin.resume();

내가 알아 내고 싶은 것은이 샘플에서와 같이 STDIN 대신 파일에서 한 번에 한 줄씩 읽는 방법입니다.

나는 시도했다 :

 fs.open('./VeryBigFile.csv', 'r', '0666', Process);

 function Process(err, fd) {
    if (err) throw err;
    // DO lazy read 
 }

하지만 작동하지 않습니다. 나는 핀치로 PHP와 같은 것을 다시 사용할 수 있다는 것을 알고 있지만 이것을 알아 내고 싶습니다.

파일이 메모리가있는 서버보다 훨씬 크기 때문에 다른 대답은 효과가 없다고 생각합니다.



답변

Node.js v0.12부터 Node.js v4.0.0부터 안정적인 readline 코어 모듈이 있습니다. 외부 모듈없이 파일에서 행을 읽는 가장 쉬운 방법은 다음과 같습니다.

const fs = require('fs');
const readline = require('readline');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.

  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}

processLineByLine();

또는 대안으로 :

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('file.in')
});

lineReader.on('line', function (line) {
  console.log('Line from file:', line);
});

final이 없어도 마지막 행은 올바르게 읽습니다 (Node v0.12 이상) \n.

업데이트 :이 예제는 노드의 API 공식 문서 추가 .


답변

이러한 간단한 작업을 위해 타사 모듈에 의존해서는 안됩니다. 쉬워

var fs = require('fs'),
    readline = require('readline');

var rd = readline.createInterface({
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});

rd.on('line', function(line) {
    console.log(line);
});


답변

open파일 이 필요하지 않지만 대신을 만들어야합니다 ReadStream.

fs.createReadStream

그런 다음 해당 스트림을 Lazy


답변

파일을 한 줄씩 읽는 데 아주 좋은 모듈이 있습니다. 선 리더

그것으로 당신은 단순히 작성 :

var lineReader = require('line-reader');

lineReader.eachLine('file.txt', function(line, last) {
  console.log(line);
  // do whatever you want with line...
  if(last){
    // or check if it's the last one
  }
});

더 많은 제어가 필요한 경우 “java-style”인터페이스를 사용하여 파일을 반복 할 수도 있습니다.

lineReader.open('file.txt', function(reader) {
  if (reader.hasNextLine()) {
    reader.nextLine(function(line) {
      console.log(line);
    });
  }
});


답변

require('fs').readFileSync('file.txt', 'utf-8').split(/\r?\n/).forEach(function(line){
  console.log(line);
})


답변

2019 년 업데이트

공식 Nodejs 문서에 멋진 예제가 이미 게시되어 있습니다. 여기

컴퓨터에 최신 Nodejs가 설치되어 있어야합니다. > 11.4

const fs = require('fs');
const readline = require('readline');

async function processLineByLine() {
  const fileStream = fs.createReadStream('input.txt');

  const rl = readline.createInterface({
    input: fileStream,
    crlfDelay: Infinity
  });
  // Note: we use the crlfDelay option to recognize all instances of CR LF
  // ('\r\n') in input.txt as a single line break.

  for await (const line of rl) {
    // Each line in input.txt will be successively available here as `line`.
    console.log(`Line from file: ${line}`);
  }
}

processLineByLine();


답변

오래된 주제이지만 작동합니다.

var rl = readline.createInterface({
      input : fs.createReadStream('/path/file.txt'),
      output: process.stdout,
      terminal: false
})
rl.on('line',function(line){
     console.log(line) //or parse line
})

단순한. 외부 모듈이 필요 없습니다.