NodeJS에서 입력받기(콘솔창, 파일)

Marco·2021년 11월 3일
0

readline 모듈을 사용

  • readline 모듈은 한 번에 한 줄씩 읽기 가능한 스트림(예: process.stdin)에서 데이터를 읽이 위한 인터페이스를 제공한다.
  • readline.Interface클래스의 인스턴스는 readline.createInterface()메서드를 사용하여 생성된다. 모든 인스턴스는 입력 가능한 input스트림과 출력 가능한 output 메서드와 연동된다.

1. line 이벤트, close 이벤트를 활용하여 콘솔창에서 한 줄 입력받기

  • line 이벤트

    • 'line'마다 이벤트가 방출되는 input스트림 라인 종료 입력을 수신한다 ( \n, \r나 \r\n). 이것은 일반적으로 사용자가 Enter또는 Return을 누를 때 발생한다. 리스너 함수(listener function)는 수신된 입력의 한 줄을 포함하는 문자열과 함께 호출된다.
  • close 이벤트

    • 'close'이벤트는 다음 중 하나의 경우가 발생하면 실행된다.
      • close()메서드 호출
      • 콘솔 입력창에서 Ctrl + C 를 입력
//readline 모듈을 로드하고 최초에는 createInterface를 통해 input을 생성한다.
const rl = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout,
});

rl.on('line', (line) => {
  console.log(line);
  rl.close();
}).on('close', () => {
  process.exit();
});

여러 줄 입력받기

const rl = require('readline').createInterface({
  input: process.stdin,
  output: process.stdout,
});
const list = [];
rl.on('line', (line) => {
  //rl.close()가 없어서 엔터를 눌러 줄이 바뀌어도 계속 입력된다.
  //로컬에서 강제로 중지하려면 Ctrl+C나 Ctrl+D
  //한 줄에 입력된 값을 한 칸 띄어쓰기 기준으로 배열에 push
  list.push(line.split(' '));
}).on('close', () => {
  //코드작성구간시작
  console.log(list);
  //코드작성구간끝
  process.exit();
});

question() 메서드 사용하여 콘솔창에서 질문하고 응답받기를 한 번에

  • 구문 : rl.question(query[,options], callback)
    • query 에는 string으로 질문을 쓰며, 이 내용은 프롬프트 창에 출력된다.
    • callback함수는 사용자의 입력으로 유발된다.
  • 예시
const rl = require('readline').createInterface({
  input: process.stdin,
  output: process.stdin,
});
r;.question('What is your favorite food? ', (answer) => {
  console.log(`Oh, so your favorite food is ${answer}`);
  //여기에는 넣지 않았지만 콘솔창에 입력을 그만받고 싶다면 마찬가지로 close()를 해야 한다.
});

한 줄로 입력받은 string을 띄어쓰기를 기준으로 배열로 저장하기

rl.question(
  '★ 사다리꼴의 윗변, 아랫변, 높이를 순서대로 띄어쓰기하여 한줄로 입력해주세요.\n',
  (sizes) => {
    const sizeArray = sizes
      .trim()
      .split(' ')
  }
);
  • trim() 메서드는 string 좌우 공백을 제거한다.
  • split(' ') 메서드가 여기서 핵심이다. 문자열을 분해하여 배열을 반환한다. 따옴표 사이에 입력된 값을 기준으로 분해된다. 여기서는 하나의 빈 칸이 따옴표 사이에 있으므로 빈 칸을 기준으로 분해한다.

2. 줄 단위로 파일 스트림 읽기

가장 쉬운 방법은 fs.ReadStreamAPI와 for await...of루프를 활용하는 것이다.

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

또는 'line'이벤트를 사용할 수 있다 .

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

const rl = readline.createInterface({
  input: fs.createReadStream('sample.txt'),
  crlfDelay: Infinity
});

rl.on('line', (line) => {
  console.log(`Line from file: ${line}`);
});

더 자세한 내용은 nodeJS 문서에서 확인할 수 있다.
https://nodejs.org/api/readline.html#readline

profile
블로그 이사 🚚 https://wonsss.github.io/

0개의 댓글