|
import gradio as gr |
|
import pandas as pd |
|
import os |
|
import tempfile |
|
import chardet |
|
|
|
def detect_encoding(file_path): |
|
""" |
|
νμΌμ μΈμ½λ©μ κ°μ§νλ ν¨μ |
|
""" |
|
with open(file_path, 'rb') as f: |
|
result = chardet.detect(f.read()) |
|
return result['encoding'] |
|
|
|
def merge_csv_files(files): |
|
""" |
|
μ¬λ¬ CSV νμΌμ νλλ‘ λ³ν©νλ ν¨μ |
|
|
|
Args: |
|
files: μ
λ‘λλ CSV νμΌ λͺ©λ‘ |
|
|
|
Returns: |
|
λ³ν©λ CSV νμΌ κ²½λ‘μ μν λ©μμ§ |
|
""" |
|
if not files or len(files) == 0: |
|
return None, "νμΌμ΄ μ
λ‘λλμ§ μμμ΅λλ€." |
|
|
|
if len(files) > 30: |
|
return None, "μ΅λ 30κ° νμΌκΉμ§λ§ λ³ν© κ°λ₯ν©λλ€." |
|
|
|
try: |
|
|
|
dataframes = [] |
|
for file in files: |
|
|
|
encoding = detect_encoding(file.name) |
|
try: |
|
df = pd.read_csv(file.name, encoding=encoding) |
|
except UnicodeDecodeError: |
|
|
|
encodings_to_try = ['cp949', 'euc-kr', 'latin1', 'ISO-8859-1'] |
|
for enc in encodings_to_try: |
|
try: |
|
df = pd.read_csv(file.name, encoding=enc) |
|
break |
|
except UnicodeDecodeError: |
|
continue |
|
else: |
|
return None, f"νμΌ '{os.path.basename(file.name)}'μ μΈμ½λ©μ κ²°μ ν μ μμ΅λλ€." |
|
|
|
dataframes.append(df) |
|
|
|
|
|
if dataframes: |
|
merged_df = pd.concat(dataframes, ignore_index=True) |
|
|
|
|
|
with tempfile.NamedTemporaryFile(delete=False, suffix='.csv') as tmp: |
|
output_path = tmp.name |
|
|
|
|
|
merged_df.to_csv(output_path, index=False, encoding='utf-8-sig') |
|
|
|
return output_path, f"{len(files)}κ° νμΌμ΄ μ±κ³΅μ μΌλ‘ λ³ν©λμμ΅λλ€. Excelμμ μ΄ λ UTF-8 μΈμ½λ©μΌλ‘ μ΄μ΄μ£ΌμΈμ." |
|
else: |
|
return None, "λ³ν©ν λ°μ΄ν°κ° μμ΅λλ€." |
|
|
|
except Exception as e: |
|
return None, f"μ€λ₯ λ°μ: {str(e)}" |
|
|
|
|
|
with gr.Blocks(title="CSV νμΌ λ³ν©κΈ°") as app: |
|
gr.Markdown("# CSV νμΌ λ³ν©κΈ°") |
|
gr.Markdown("μ΅λ 30κ°μ CSV νμΌμ νλλ‘ λ³ν©ν©λλ€.") |
|
|
|
with gr.Row(): |
|
with gr.Column(): |
|
input_files = gr.File( |
|
file_count="multiple", |
|
label="CSV νμΌ μ
λ‘λ (μ΅λ 30κ°)" |
|
) |
|
|
|
with gr.Column(): |
|
merge_button = gr.Button("νμΌ λ³ν©νκΈ°") |
|
output_file = gr.File(label="λ³ν©λ CSV") |
|
status = gr.Textbox(label="μν") |
|
|
|
merge_button.click( |
|
fn=merge_csv_files, |
|
inputs=[input_files], |
|
outputs=[output_file, status] |
|
) |
|
|
|
|
|
if __name__ == "__main__": |
|
app.launch() |