반응형
Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | ||
6 | 7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 | 19 |
20 | 21 | 22 | 23 | 24 | 25 | 26 |
27 | 28 | 29 | 30 |
Tags
- dml
- code kata
- wecode
- 러닝
- 위코드
- Udemy
- 걷기
- SQL
- 크로스핏
- github
- dql
- 활동 킬로칼로리
- 박스점프
- node
- MySQL
- node.js
- 달리기
- nodejs
- 메디패치
- JavaScript
- git
- 운동일지
- express
- 드림코딩
- 월별 운동일지
- 습윤밴드
- 독서 리뷰
- axios
- 홈트
- Til
Archives
- Today
- Total
RISK IT
[TIL 2_23.1.10.] built-in file system 본문
반응형
오늘 배운 것
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
가 범위를 초과해 발생한 에러였던 것이다.
한 블로그에서 위 에러는 다음 세가지 등의 이유 때문에 발생하는 것이라고 했다.
- 경로를 재확인한다.
- DB에 제대로 컬럼이 존재하는지 확인한다.
- 선언에 오타가 있는지 확인한다.
간단한 문제 때문인 것 같아서 천천히 코드를 다시 봤더니 역시나였다.
이렇게 고군분투 하다가 그 이후로는 나름 잘 진행할 수 있었다.
최종 코드는 다음과 같다.
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 })
);
반응형
'IT > TIL' 카테고리의 다른 글
[TIL6_23.1.14.] mySQL 데이터 추가/수정/삭제/조회 (0) | 2023.01.14 |
---|---|
[TIL5_23.1.13.] mySQL - DDL 이용하여 데이터베이스 생성, 접근, 변경 (0) | 2023.01.14 |
[TIL4_23.1.12.] Simple API - 게시글 등록, 목록조회 및 httpie 입력방법 (0) | 2023.01.13 |
[TIL3_23.1.11] Simple API - 유저 회원가입 하기 (0) | 2023.01.13 |
[TIL 1_23.1.9.] API (0) | 2023.01.09 |