StoryCode

csv 를 읽어 mysql create table 문장 생성

Python, 파이썬
반응형

# Ubuntu 에서 특정 디렉토리에 있는 CSV 들을 읽어서 각 csv 에 매칭되는 create table sql 생성한다. 

 

import csv
import os
import getpass

# 특정 디렉토리 경로
username = getpass.getuser()
directory = os.path.join("/home", username, "mycsvdirectory/")

# 디렉토리 내의 모든 csv 파일 목록 가져오기
filenames = os.listdir(directory)
csv_files = [f for f in filenames if f.endswith(".csv")]

with open("CREATETABLE.sql", "w") as f:
    f.truncate()

# 각 csv 파일을 읽어 CREATE TABLE 문 생성 및 저장
for csv_file in csv_files:
    print("Filename :" + csv_file)
    with open(os.path.join(directory, csv_file), "r") as f:
        reader = csv.reader(f)

        # 첫 번째 행 (헤더)을 읽어 컬럼 목록으로 변환
        headers = next(reader)

        # 컬럼명에서 '-'를 '_'로 변경
        headers = [col.replace("-", "_") for col in headers]
        print(headers)

        # 첫 번째 컬럼을 제외한 나머지 컬럼 목록 생성
        remaining_headers = headers[0:]
        print(remaining_headers)

        # 각 컬럼의 최대 길이 저장
        column_max_lengths = {}
        for col in remaining_headers:
            column_max_lengths[col] = 0

        # 데이터 읽어서 각 컬럼 최대 길이 계산
        for row in reader:
            for i, col in enumerate(row):
                # print(row)
                if len(col) > column_max_lengths[remaining_headers[i]]:
                    column_max_lengths[remaining_headers[i]] = len(col)
        print(column_max_lengths);

        # DROP TABLE IF EXISTS 문 생성
        drop_table_sql = f"DROP TABLE IF EXISTS MYTABLE_{csv_file[:-4].upper()}_TBL;\n"

        # CREATE TABLE 문 생성
        create_table_sql = f"""
            CREATE TABLE IF NOT EXISTS MYTABLE_{csv_file[:-4].upper()}_TBL (
                {", ".join([f"{col} VARCHAR({column_max_lengths[col]})" for col in remaining_headers])}
            );

            CREATE INDEX idx_{csv_file[:-4].upper()}_TBL ON MYTABLE_{csv_file[:-4].upper()}_TBL ({headers[0]});
        """

        # SQL 문을 1.0.result.CREATETABLE.sql 파일에 저장
        with open("CREATETABLE.sql", "a") as f:
            f.write(drop_table_sql)
            f.write(create_table_sql + "\n")

반응형

'Python, 파이썬' 카테고리의 다른 글

Debuggin,디버깅,pdb  (0) 2024.05.24
import directory 지정해주기  (0) 2024.04.19
..., :, Ellipsis  (0) 2023.09.21
Debugging.디버깅.breakpoint()  (0) 2023.09.20
print().5 Ways  (0) 2022.12.18