iyOmSd/Title: Swift

[Swift] Python을 이용한 Excel -> Json 맵핑 스크립트 만들기

냄수 2024. 9. 29. 14:51
반응형

다국어를위해 로컬라이징을 사용하거나 

어떠한 단어 혹은 정책들은 액셀로 관리하는 경우가 많은데요

개발자 입장에서는 이파일을 보고

복사해서 형식에 맞게 다시 옮겨적어서 전처리 과정을 거쳐서 데이터로 사용해야합니다.

물론 이과정에서 누락 혹은 실수가 일어나서 휴먼에러가 도중에 생기기도하죠

 

이러한 과정을 자동화 시켜서 알아서 파일을 뽑아줄 수 있도록 스크립트를 작성해볼거에요

전 파이썬을 잘모르기때문에..

기본 코드는 지피티 선생님이 도와주셨습니다! 👏

 

우선 파이썬을 설치해야겟죠

 

터미널을 실행시키고 파이썬 라이브러리 설치합니다

pip3 install pandas openpyxl
 

실행은 아래와 같은 명령어로 이뤄집니다(경로 체크해주세요!)

python3 <파이썬 스크립트> <엑셀파일경로>
# python3 excelToJson.py Keyword.xlsx

 

액셀파일은 각자들고있다고가정하고!

파이썬코드를 액셀 형식에 맞게 매칭시켜주세요(저와는 다른 형식일거기 때문이에요)

 

우선 제 액셀파일의 예시는

4열 n행을 사용하고있습니다.  예시는 아래와같습니다

1열 2열 3열 4열
키1 데이터A 조건문1 데이터1
키2 데이터B 조건문2 데이터2
키3 데이터C 조건문3 데이터3
키4 데이터D 조건문4 데이터4
키5 데이터E 조건문5 데이터5

 

 

저는 액셀에 5행까지 다른데이터가 존재해서 5행을 스킵했고

액셀의 b~e열만 사용했어서 조정을 했습니다.

import pandas as pd
import json
import sys
import shutil
import os

def excel_to_json_groups(excel_file, json_file):
    # 엑셀 파일 읽기, B열부터 시작하고 첫 5행 스킵 (위에 5행에 다른 데이터 존재)
    df = pd.read_excel(excel_file, header=None, skiprows=5, usecols='B:E')
    
    # 데이터프레임의 열 이름을 0부터 3까지로 설정
    df.columns = range(4)
    
    # 각 행을 JSON 객체로 변환
    json_data = []
    for _, row in df.iterrows():
        # 4열(E열) 값이 특정값인 경우 제외
        if str(row[3]).strip().upper() == '특정값':
            continue
            
        # 3열(D열, 인덱스 2)의 값이 'O'인지 확인
        if pd.notnull(row[2]) and row[2].strip().upper() == 'O':
            value = row[1]  # 2열(C열, 인덱스 1)의 값 사용
        else:
            value = row[3]  # 4열(E열, 인덱스 3)의 값 사용
        
        row_dict = {
            "key": row[0], # 1열(B열, 인덱스 0)의 값 사용
            "value": value
        }
        # null 값 제외
        if not pd.isnull(value):
            json_data.append(row_dict)
    
    # JSON 파일로 저장
    with open(json_file, 'w', encoding='utf-8') as f:
        json.dump(json_data, f, ensure_ascii=False, indent=2)

    print(f"'{excel_file}'의 데이터를 'convertFile.json'로 성공적으로 변환했습니다.")
    print(f"총 {len(json_data)}개의 행이 처리되었습니다.")

 

이 스크립트를 돌리면 이런 형식의 json파일이 생성될거에요

{
  "key": "키1",
  "value": "데이터1"
},
{
  "key": "키2",
  "value": "데이터B"
},

 

현재 스크립트를 실행시키면 실행시킨위치에 파일이 생성될거에요

생성된 json파일을 자동으로 원하는 위치에 저장해주면 좋겟죠? 

아래와같이 파일과 경로를 받아서 이동시켜주는 함수를 구현해주세요

# 파일 이동 함수
def move_file(src, dst_dir):
    # 목적지 디렉토리가 없으면 생성
    if not os.path.exists(dst_dir):
        os.makedirs(dst_dir)
    
    # 파일 이름 추출
    file_name = os.path.basename(src)
    
    # 최종 목적지 경로
    dst = os.path.join(dst_dir, file_name)
    
    # 파일 이동
    shutil.move(src, dst)
    print(f"파일이 {dst}로 이동되었습니다.")

 

 

두함수를 이용해서 실행시키도록하고

매개변수 python3 <파이썬 스크립트> <엑셀파일경로>

형식이아니라면 에러를 발생시킵니다

json파일이름과 경로를 설정해주고 위 2개의 함수를 실행시켜주면 끝이에요

if __name__ == "__main__":
    if len(sys.argv) != 2:
        print("사용법: python3 script.py <엑셀파일경로>")
        sys.exit(1)
    
    excel_file = sys.argv[1]
    json_file = "(원하는파일이름).json"
    savePath = '../(원하는폴더)/(원하는폴더)'
        
    excel_to_json_groups(excel_file, json_file)
    move_file(json_file, savePath)

 

 

해당 json파일을 프로젝트에 넣고

struct Type: Decodable {
  let key: String
  let value: String
}

private func readJson() -> [Type] {
    guard
        let path = Bundle.main.path(
            forResource: "json파일이름",
            ofType: "json"
        ),
        let jsonString = try? String(contentsOfFile: path),
        let data = jsonString.data(using: .utf8),
        let model = try? JSONDecoder().decode([Type].self, from: data) else {
        return []
    }
    return model
}

json파일을 읽어서 원하는 모델로 디코딩해주면

액셀파일을 이용해서 json을 만들고 json을 읽어서

프로젝트에 사용할 준비 완료입니다!!

 

반응형