본문 바로가기
NodeJS, NPM, Koa/NodeJS, NPM, Express

NodeJS 에서 CSV 읽어들이기 # JS

by Developer88 2022. 5. 5.
반응형

오늘은 NodeJS에서 CSV 파일을 읽어들이는 방법에 대해서 정리해 보도록 하겠습니다.

 

1. 큰 그림

어떤 방식으로 csv파일을 읽어들일지 정리해보면 다음과 같습니다.

csv파일은 row는 "\n" 또는 "\r"로 구분되어 있구요.

Column은 ","으로 구분되어 있습니다.

그러므로, NodeJS파일핸들 모듈을 이용해서 파일을 읽어들인다음,

먼저 "\n" 또는 "\r"로 텍스트데이터를 분리해서 list에 넣어주구요.

각 list에 들어간 아이템들을 다시 ","으로 분리해서 Column으로 읽어들이는 것 입니다.

 

2. fs 모듈 

제일 먼저 필요한 것은 fs 모듈인데요. NodeJS에 이미 포함되어 있으므로 따로 설치하거나 할 필요는 없습니다.

require로 해당 모듈을 사용할 수 있도록 해 줍니다.

 

const fs = require("fs");

 

꼭 필수는 아니지만, 파일을 읽어들일 때 경로를 가져오기에 편하게 하기 위해서, path모듈도 같이 추가해주는 것이 좋습니다.

 

const fs = require("fs");
const path = require("path");

 

3. CSV 파일 읽어들이기

3-1. readFileSync 로 파일 읽어들이기

fs의 readFile()함수를 이용해서 파일을 읽어들이는 것이 먼저입니다.

readFile의 문서를 보면 다음과 같이 나와있습니다.

option에 string이 들어간다면, encoding에 대해서 명시해 주어야 합니다.

 

동기함수인 readFileSync와 비동기함수인 readFile이 있는데요.

상황에 맞게 사용하시면 됩니다.

개인적으로 CSV파일의 경우, 많지않은 데이터를 가공해서 다른 형식이나 DB에 저장해 사용하게 되었는데요.

비동기적으로 읽어들여야 하는 경우보다는 동기적으로 읽어들이는 경우가 많아서,

readFileSync함수를 더 많이 썻던 것 같습니다.

 

 

아래는 비동기적으로 파이전체를 읽어들이는 readFile() API에 대한 공식 문서설명입니다.

 

 

저는 이글에서는 readFileSync()를 사용하겠습니다.

readFileSync의 첫번째 인자는 패스이고, 두번째 인자는 Option인데요.

인코딩방식만 utf-8로 지정해 주었습니다.

 

파일위치를 이용할 때는 path모듈을 이용하는 것이 편합니다.

__dirname을 이용해서 현재위치를 가져올 수 있구요. 인자로 전달해준 디렉토리 명들을 조합해 줄 수 있으므로, 타이포에러도 줄어듭니다.

아래에서는 path모듈의 join메소드를 이용해서,

자신보다 상위의 폴더에 있는 csvs라는 폴더의 test.csv파일의 패스를 지정해 주었습니다.

 

 

 

3-2. row를 list로 split 하기

이제 csv파일을 list로 split해 담아보겠습니다.

 

JS의 split()함수는 String을 분리해서 list로 return해 주는데요.

이를 이용해 csv파일의 row를 분리하도록 하겠습니다.

 

 

한가지 주의할 점은 개행으로 split을 해주는데 있어서,

다음의 경우중 어떤 경우인지 알아내야 한다는 것 입니다.

저의 경우 '\r\n' 이었습니다.

  • \r\n
  • \n
  • \r

 

아래와 같이 "\r\n"을 기준으로 slit해서 list에 담아줍니다.

이 list들은 row데이터들이라고 할 수 있겠습니다.

 

 

 

이렇게 split을 해주었는데, csv파일의 비어있는 개행이 들어가서 아무것도 없는 ''가 들어가 있을 경우가 있습니다.

그럴때는 아래와 같이 pop()메소드를 이용해서 해당 아이템만 삭제해 주면 됩니다.

 

 

3-3. "," split

위에서 각 줄(row)들의 데이터를 list에 개별적으로 담아놓았는데요.

이제는 다음과 같은 순서로 진행하면 되겠습니다.

 

  • 위에서 list로 저장한 rows를 반복문을 이용해서 한줄(row)씩 읽고,
  • 각각의 row에 저장된 데이터들을 ","로 split해서 다시 list에 담은다음,
  • 이렇게 list에 담긴 data들을 for문으로 하나씩 분리해, JS객체로 사용하기 쉽게 저장

좀 더 디테일하게는 CSV의 첫줄은 컬럼타이틀이 들어가므로 따로 분리해서 저장했다가,

각 row들의 데이터들을 JavaScript객체로 저장할 때 key값으로 사용해 줍니다.

results라는 list에 이렇게 저장한 객체들을 push해 주기만 하면 모든 데이터가 result에 들어가게 됩니다.

 

 

이상으로 CSV파일을 NodeJS에서 읽어들이는 방법에 대해서 정리해 보았습니다.

728x90

댓글