ETC

[CSV to JSON] 공공데이터 자료 변환 후 mongoDB에 넣기

moguogu 2022. 7. 30. 18:20

1. 문제점

이번 프로젝트에서 공공데이터를 활용해서 DB에 넣을 필요가 있었다

이때 주어진 csv 파일이 문제가 있었는데, 정규화가 하나도 안된 상태였다

사용한 공공데이터는 아래 링크에서 볼 수 있다

https://www.data.go.kr/data/3038404/fileData.do?recommendDataYn=Y 

 

한국산업인력공단_국가기술자격 종목별 시험정보_20220620

국가기술자격의 종목별 시험정보(종목명, 개요, 변쳔과정, 수행직무, 진로 및 전망, 취득방법)에 대한 데이터입니다.

www.data.go.kr

우선 엑셀로 파일을 열어서 확인해봤는데 아래와 같았다

Column이 3개로만 나누어져있었으며 type이라고 정의한 곳에는 사실 column으로 가야하고 contents는 각 컬럼에 맞게 내용으로 가야한다

더 문제였던 부분은 모든 자격마다 동일한 수의 type을 갖고있는 것도 아니였다

해당 파일을 정규화해서 db에 넣어야한다

2. 과정

1. csv -> json

기존에도 크롤링을 하거나해서 수집한 데이터들은 csv보다 개인적으로 json이 편해서 파일형을 변환하기로 했다

그리고 컬럼 수정도 필요했기 때문에 파이썬을 이용했다

2. python & colab활용

import csv
import json

input_file_name = "drive/My Drive/Colab Notebooks/a.csv"
output_file_name = "drive/My Drive/Colab Notebooks/a.json"
with open(input_file_name, "r", encoding="utf-8", newline="") as input_file:
    products=[]    
    reader = csv.reader(input_file,delimiter=',')
    # 첫 줄은 col_names 리스트로 읽어 놓고
    cnt =0 #id 값이 될 변수 
    
    name = "가스기술사" #첫 자격이름/정보 저장

    for row in reader: #매 row를 읽어서 저장 
      if(row[0]!=name):#자격 이름이 바뀌었으면 그 전 값 저장
        cnt+=1
        product= {
          "id": cnt,
          "name": name,
          "type":types,
          "info": info,
          "job":job,
          "link":link,
          "company": company,
          "details": details,
          "usage":usage,
          "exam": exam,
          "way":way
        }
        products.append(product)
        name = row[0] #이름 업데이트
        types=None #각 자격정보 마다 없는 정보가 생기기 때문에 변수 초기화
        info=None
        job=None
        link=None
        company=None
        details=None
        usage=None
        exam=None
        way=None
      if(row[1]=='개요'):
        types= row[2]
      if(row[1]=='변천과정'):
        info= row[2]
      if(row[1]=='수행직무'):
        job= row[2]
      if(row[1]=='실시기관 홈페이지'):
        link= row[2]  
      if(row[1]=='실시기관명'):
        company= row[2]
      if(row[1]=='위 자격취득자에 대한 법령상 우대현황'):
        details= row[2]
      if(row[1]=='진로 및 전망'):
        usage = row[2]
      if(row[1]=='출제경향'):
        exam= row[2]
      if(row[1]=='취득방법'):
        way= row[2]
 
with open(output_file_name, "w", encoding="utf-8", newline="") as output_file:
     output_file.write(json.dumps(products,ensure_ascii=False)) #json 파일로 저장

해당 파일을 코랩환경에서 실행했다

물론 이 전에 코랩이랑 내 구글드라이브를 mount해준 뒤 실행했다

 

3. mongoDB에 data import

GUI로 studio 3T를 쓰고 있어서 data import를 해주는 기능이 따로 있는지 찾아봤는데 json은 유료이다 

따라서 다른 방법을 찾아보니 cmd로 직접 import 할 수 있었다

 

cmd창을 열어서 아래의 명령어를 입력하면 정확히 무슨 값인지는 모르겠지만 데이터들이 나온다

mongod

이 과정 후 아래의 명령어를 입력해야하는데, mongoimport.exe가 설치가 안되어 있는 경우 다운로드 받아야한다 

그렇지 않으면 아래의 사진과 같은 결과를 마주할 수 있다

내 경우에는 전에 mongoDB를 설치했던 bin 폴더 안에 exe 파일만 따로 넣어줘서 환경변수를 추가로 설정하지 않았다

mongoimport --db 스키마이름 --collection 콜렉션이름 --host "localhost:27017" --jsonArray --file "파일경로"

다음으로 위의 명령어를 입력하면 아래의 사진처럼 성공적으로 데이터가 들어간 것을 확인할 수 있다 

3. 결과

다시 studio 3T로 결과 값을 조회해 봤다 

기존에 구상했던 데로 column에 맞게 값이 들어간 것을 확인할 수 있다

 

4. 참조

mongoDB import: https://spidyweb.tistory.com/167

 

'ETC' 카테고리의 다른 글

[Socket] Socket 통신  (0) 2021.07.28
[Authorization] OAuth 2.0  (0) 2021.07.28
[SERVER] FLASK  (0) 2021.07.28
[GIT] GIT 커밋취소, gitIgnore  (0) 2021.07.27