RISK IT

[TIL 2_23.1.10.] built-in file system 본문

IT/TIL

[TIL 2_23.1.10.] built-in file system

nomoremystery 2023. 1. 11. 01:06
반응형

오늘 배운 것

Database 기초

  • 과제: db.diagram을 이용한 스타벅스 음료 페이지 모델링

Node.js intro(Flipped Learning)

  • 과제: built-in file system module 실습
function csvToJSON(csv) {
  const lines = csv.split("\n");
  const result = [];
  const headers = lines[0].split(",");

  for (let i = 1; i < lines.length; i++) {
    if (!lines[i]) continue;
    const obj = {};
    const currentline = lines[i].split(",");

    for (let j = 0; j < headers.length; j++) {
      obj[headers[j]] = currentline[j];
    }
    result.push(obj);
  }
  return result;
}

우선은 csv파일을 json파일로 변환하는 것이 문제였다.

파이썬 잠깐 한 기억으로는 쉽게 변환했던 것 같은데, 자바스크립트에서는 쉽게 안되는 것 같았다.

터미널에 npm 쳐서 진행할 수도 있었는데, 그러면 과제의 의도와는 맞지 않는 것 같아서 코드 내에서 변환 시킬 수 있는 방법을 찾고자 했다.

그래서 방법을 찾던 중 stackoverflow에서 위의 코드를 찾았다.
과제 완료하는 데 급급해서 아직 저 코드의 작동 원리는 파악하지 못했지만 일단 잠시 빌려다 썼다.

const fs = require("fs");

const filePostCsv = fs.readFileSync("./posts.csv");
const stringfilePostCsv = filePostCsv.toString();
let filePostJson = csvToJSON(stringfilePostCsv);

const fileUserCsv = fs.readFileSync("./users.csv");
const stringfileUserCsv = fileUserCsv.toString();
let fileUserJson = csvToJSON(stringfileUserCsv);

for (let i = 0; i <= filePostJson.length; i++) {
  for (let j = 0; j <= fileUserJson.length; j++) {
    if (filePostJson[i]["user_id"] == fileUserJson[j]["id"]) {
      fileUserJson[j].posts = filePostJson[i];
    }
  }
  console.log(fileUserJson);
}

이렇게 하는데 아래과 같은 에러가 뜨면서 진행이 더 이상 안됐다.

TypeError: Cannot read properties of undefined (reading 'id') at Object.

이거 해결하느라 시간을 엄청 오래 잡아먹었는데, 알고보니까 단순 실수에 의한 에러였다.
for문에서 i의 범위가 <= 이라 fileUserJson[j].posts = filePostJson[i];posts가 범위를 초과해 발생한 에러였던 것이다.

한 블로그에서 위 에러는 다음 세가지 등의 이유 때문에 발생하는 것이라고 했다.

  1. 경로를 재확인한다.
  2. DB에 제대로 컬럼이 존재하는지 확인한다.
  3. 선언에 오타가 있는지 확인한다.
    간단한 문제 때문인 것 같아서 천천히 코드를 다시 봤더니 역시나였다.

이렇게 고군분투 하다가 그 이후로는 나름 잘 진행할 수 있었다.

최종 코드는 다음과 같다.

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

function csvToJSON(csv) {
  const lines = csv.split("\n");
  const result = [];
  const headers = lines[0].split(",");

  for (let i = 1; i < lines.length; i++) {
    if (!lines[i]) continue;
    const obj = {};
    const currentline = lines[i].split(",");

    for (let j = 0; j < headers.length; j++) {
      obj[headers[j]] = currentline[j];
    }
    result.push(obj);
  }
  return result;
}

const filePostCsv = fs.readFileSync("./posts.csv");
const stringfilePostCsv = filePostCsv.toString();
let filePostJson = csvToJSON(stringfilePostCsv);
for (let i = 0; i < filePostJson.length; i++) {
  delete filePostJson[i].created_at;
}

const fileUserCsv = fs.readFileSync("./users.csv");
const stringfileUserCsv = fileUserCsv.toString();
let fileUserJson = csvToJSON(stringfileUserCsv);
for (let i = 0; i < fileUserJson.length; i++) {
  delete fileUserJson[i].email;
}

for (let i = 0; i < fileUserJson.length; i++) {
  fileUserJson[i].posts = [];
}

for (let j = 0; j < fileUserJson.length; j++) {
  for (let i = 0; i < filePostJson.length; i++)
    if (fileUserJson[j]["id"] == filePostJson[i]["user_id"]) {
      fileUserJson[j]["posts"].push(filePostJson[i]);
    }
}
console.log(
  util.inspect(fileUserJson, { showHidden: false, depth: null, colors: true })
);
반응형