리팩토링 전 링크: BE_intro_Assignment_10.25
const fileSystem = require("fs");
const util = require('util')
const users = fileSystem.readFileSync("./users.csv", "utf-8");
const posts = fileSystem.readFileSync("./posts.csv", "utf-8");
const csvToObject = (csv) => {
csv = csv.replace(/\r/g,"") // users에 있는 \r을 제거
csv = csv.replace(/, /g,",") // posts에 있는 ", "을 ","로 변경
const rows = csv.split("\n")
.filter(el => el !== "") // posts에 있는 ""을 제거
.map(el => el.split(","))
const result = []
for(let i = 1; i<rows.length; i++){
const obj = {}
for(let j = 0; j<rows[0].length; j++){
obj[rows[0][j]] = rows[i][j]
}
result.push(obj)
}
return result
}
const postsByUsers = (postsArr, usersArr) => {
for(let elU of usersArr){
elU.posts = []
for(let elP of postsArr){
if(elU.id === elP.user_id) elU.posts.push(elP)
}
}
return util.inspect(usersArr, {showHidden: false, depth: null, colors: true})
}
const usersArr = csvToObject(users)
const postsArr = csvToObject(posts)
console.log(postsByUsers(postsArr, usersArr))
당시 수강 중일 때는 빨리 과제 제출하고 다음날 자료를 예습해야한다는 급급한 마음에 이런 과제를 내준 의도를 파악할 여유가 없었다.
사람이 csv파일을 작성하다보면 저장되는 형식이 다를 수 있다.
그럼 각 csv파일마다 서로다른 코드를 적용해서 매번 데이터를 입력할 것인가?
Nope! 어떤 예외에도 동일한 출력 결과를 만드는 하나의 함수를 만들고 적용하면 될 일이다.
1차 프로젝트를 진행할 때 fs모듈을 활용해서 csv파일에 모은 자료를 DB에 저장해야한다는 말을 듣고, 주변에서 당황의 탄식이 나왔을 때, 이 과제를 했던 게 생각나 여유롭게 블로그를 뒤졌지만... 기껏 공들여 기술블로그에 기록해놓으면 뭐하는가. 만들어놓은 건 오직 해당 과제만을 풀기 위한 죽은 코드였고 재활용이 불가능했다. 결국 당시엔 부트캠프의 의도와는 다르게 테이블플러스 라는 편리한 툴을 사용해서 DB를 채웠다는 이야기~.
이번 코테 대회에서도 그렇고 fs모듈을 잘 활용하는 것이 얼마나 중요한지 다시금 깨닫게 되었다.
이메일 유효성 검사 util을 학습하고, 프로그래머스를 풀고 동기의 기술과제를 함께 학습하면서 익숙해진 replace()와 정규표현식을 적용해봤는데 for문 없이 간단히 구현할 수 있어 좋았다.
filter()
를 사용하면 대용량 배열 처리 시 메모리 overflow 가능성이 있다고 하여trim()
을 사용해 문자열 양옆의 개행문자, 공백을 삭제하도록 수정함.개행문자 제거하기
https://gurtn.tistory.com/108