test-2 / app.py
Kims12's picture
Update app.py
3a94f1b verified
import gradio as gr
import pandas as pd
import re
from io import BytesIO
import tempfile
def process_excel(file_bytes):
"""
μ—…λ‘œλ“œλœ μ—‘μ…€ νŒŒμΌμ—μ„œ D4μ…€λΆ€ν„° Dμ—΄μ˜ μƒν’ˆλͺ…을 μΆ”μΆœν•˜μ—¬,
각 μ…€μ—μ„œ 특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜κ³ , 전체 셀에 λŒ€ν•΄
ν‚€μ›Œλ“œμ˜ λΉˆλ„λ₯Ό κ³„μ‚°ν•˜μ—¬ μ—‘μ…€ 파일과 ν‘œ(λ°μ΄ν„°ν”„λ ˆμž„)둜 κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
μ—λŸ¬ λ°œμƒ μ‹œ, μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν…μŠ€νŠΈ 파일과 λ°μ΄ν„°ν”„λ ˆμž„ ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
"""
# μ—‘μ…€ 파일 읽기
try:
df = pd.read_excel(BytesIO(file_bytes), header=None, engine="openpyxl")
except Exception as e:
error_message = "μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
temp_error.write(error_message.encode("utf-8"))
temp_error.close()
error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
return temp_error.name, error_df
# μ—‘μ…€ 파일 ν˜•μ‹ 체크 (μ΅œμ†Œ 4μ—΄, μ΅œμ†Œ 4ν–‰)
if df.shape[1] < 4 or df.shape[0] < 4:
error_message = "μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
temp_error.write(error_message.encode("utf-8"))
temp_error.close()
error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
return temp_error.name, error_df
# Dμ—΄(4번째 μ—΄, 인덱슀 3)μ—μ„œ 4ν–‰(인덱슀 3)λΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜΄
product_names_series = df.iloc[3:, 3]
product_names_series = product_names_series.dropna()
keyword_counts = {}
for cell in product_names_series:
# λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 경우 λ¬Έμžμ—΄λ‘œ λ³€ν™˜
if not isinstance(cell, str):
cell = str(cell)
# 특수문자 제거 (숫자, 영문, ν•œκΈ€, 곡백을 μ œμ™Έν•œ 문자 제거)
cleaned = re.sub(r'[^0-9a-zA-Zκ°€-힣\s]', '', cell)
# 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œ 뢄리
keywords = cleaned.split()
# ν•˜λ‚˜μ˜ μ…€ λ‚΄ 쀑볡 ν‚€μ›Œλ“œλŠ” 제거
unique_keywords = set(keywords)
for keyword in unique_keywords:
keyword_counts[keyword] = keyword_counts.get(keyword, 0) + 1
# ν‚€μ›Œλ“œλ₯Ό λΉˆλ„ λ‚΄λ¦Όμ°¨μˆœ(λΉˆλ„κ°€ κ°™μœΌλ©΄ ν‚€μ›Œλ“œ μ˜€λ¦„μ°¨μˆœ)으둜 μ •λ ¬
sorted_keywords = sorted(keyword_counts.items(), key=lambda x: (-x[1], x[0]))
# κ²°κ³Όλ₯Ό DataFrame으둜 생성 (A1: "ν‚€μ›Œλ“œ", B1: "λΉˆλ„")
result_df = pd.DataFrame(sorted_keywords, columns=["ν‚€μ›Œλ“œ", "λΉˆλ„"])
# μ—‘μ…€ 파일 생성 (A1, B1 셀에 헀더 μΆ”κ°€)
output = BytesIO()
try:
with pd.ExcelWriter(output, engine="openpyxl") as writer:
result_df.to_excel(writer, index=False, startrow=1, header=False)
worksheet = writer.sheets["Sheet1"]
worksheet.cell(row=1, column=1, value="ν‚€μ›Œλ“œ")
worksheet.cell(row=1, column=2, value="λΉˆλ„")
output.seek(0)
except Exception as e:
error_message = "μ—‘μ…€ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
temp_error.write(error_message.encode("utf-8"))
temp_error.close()
error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
return temp_error.name, error_df
# μž„μ‹œ μ—‘μ…€ 파일 생성 ν›„ 경둜 λ°˜ν™˜
temp_excel = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", mode="wb")
temp_excel.write(output.getvalue())
temp_excel.close()
return temp_excel.name, result_df
# κ·ΈλΌλ””μ˜€ μΈν„°νŽ˜μ΄μŠ€ 생성 (μ—‘μ…€ 파일과 κ²°κ³Ό ν‘œ 두 κ°€μ§€ ν˜•νƒœλ‘œ 좜λ ₯)
iface = gr.Interface(
fn=process_excel,
inputs=gr.File(label="μ—‘μ…€ 파일 μ—…λ‘œλ“œ", type="binary"),
outputs=[
gr.File(label="κ²°κ³Ό μ—‘μ…€ 파일"),
gr.DataFrame(label="ν‚€μ›Œλ“œ 뢄석 ν‘œ")
],
title="μ—‘μ…€ μƒν’ˆλͺ… ν‚€μ›Œλ“œ μΆ”μΆœ 및 λΉˆλ„ 뢄석",
description=(
"μ—‘μ…€ 파일의 D4μ…€λΆ€ν„° D열에 μžˆλŠ” μƒν’ˆλͺ… 데이터λ₯Ό λΆ„μ„ν•˜μ—¬, "
"특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. "
"ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ ν‚€μ›Œλ“œμ™€ λΉˆλ„λ₯Ό "
"λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ¦¬ν•œ κ²°κ³Όλ₯Ό μ—‘μ…€ 파일과 ν‘œ(λ°μ΄ν„°ν”„λ ˆμž„)둜 좜λ ₯ν•©λ‹ˆλ‹€."
)
)
iface.launch()