File size: 4,673 Bytes
da3ce18
 
 
 
1f57f2c
da3ce18
 
 
 
 
 
1f57f2c
 
da3ce18
1f57f2c
da3ce18
 
 
1f57f2c
 
 
 
 
 
da3ce18
1f57f2c
da3ce18
1f57f2c
 
 
 
 
 
da3ce18
1f57f2c
da3ce18
 
 
 
 
 
 
 
1f57f2c
da3ce18
1f57f2c
da3ce18
1f57f2c
da3ce18
 
 
 
1f57f2c
da3ce18
 
1f57f2c
da3ce18
 
1f57f2c
da3ce18
 
 
 
 
 
 
 
 
1f57f2c
 
 
 
 
 
da3ce18
1f57f2c
 
 
 
da3ce18
1f57f2c
 
 
da3ce18
 
1f57f2c
 
 
 
 
da3ce18
 
 
 
 
1f57f2c
da3ce18
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
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()