Kims12 commited on
Commit
1f57f2c
Β·
verified Β·
1 Parent(s): 66be990

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +45 -21
app.py CHANGED
@@ -1,26 +1,40 @@
 
 
1
  import gradio as gr
2
  import pandas as pd
3
  import re
4
  from io import BytesIO
 
5
 
6
  def process_excel(file_bytes):
7
  """
8
  μ—…λ‘œλ“œλœ μ—‘μ…€ νŒŒμΌμ—μ„œ D4μ…€λΆ€ν„° Dμ—΄μ˜ μƒν’ˆλͺ…을 μΆ”μΆœν•˜μ—¬,
9
  각 μ…€μ—μ„œ 특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
10
  ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜κ³ , 전체 셀에 λŒ€ν•΄
11
- ν‚€μ›Œλ“œμ˜ λΉˆλ„λ₯Ό κ³„μ‚°ν•˜μ—¬ μ—‘μ…€ 파일둜 μ €μž₯ν•©λ‹ˆλ‹€.
 
12
  """
 
13
  try:
14
- # μ—…λ‘œλ“œλœ νŒŒμΌμ„ μ½μ–΄μ˜΅λ‹ˆλ‹€. 헀더가 μ—†λŠ” μƒνƒœλ‘œ 전체 데이터λ₯Ό λΆˆλŸ¬μ˜΅λ‹ˆλ‹€.
15
  df = pd.read_excel(BytesIO(file_bytes), header=None, engine="openpyxl")
16
  except Exception as e:
17
- return "μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
 
 
 
 
 
18
 
19
- # μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯Έμ§€ 확인 (μ΅œμ†Œ 4μ—΄, μ΅œμ†Œ 4ν–‰)
20
  if df.shape[1] < 4 or df.shape[0] < 4:
21
- return "μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
 
 
 
 
 
22
 
23
- # Dμ—΄(4번째 μ—΄, 인덱슀 3)μ—μ„œ 4ν–‰(인덱슀 3)λΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜΅λ‹ˆλ‹€.
24
  product_names_series = df.iloc[3:, 3]
25
  product_names_series = product_names_series.dropna()
26
 
@@ -29,49 +43,59 @@ def process_excel(file_bytes):
29
  # λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 경우 λ¬Έμžμ—΄λ‘œ λ³€ν™˜
30
  if not isinstance(cell, str):
31
  cell = str(cell)
32
- # 특수문자 제거 (숫자, 영문, ν•œκΈ€, 곡백을 μ œμ™Έν•œ λͺ¨λ“  문자 제거)
33
  cleaned = re.sub(r'[^0-9a-zA-Zκ°€-힣\s]', '', cell)
34
- # 곡백 κΈ°μ€€μœΌλ‘œ λΆ„λ¦¬ν•˜μ—¬ ν‚€μ›Œλ“œ μΆ”μΆœ
35
  keywords = cleaned.split()
36
- # ν•˜λ‚˜μ˜ μ…€μ—μ„œλŠ” 쀑볡 ν‚€μ›Œλ“œλ₯Ό 제거
37
  unique_keywords = set(keywords)
38
  for keyword in unique_keywords:
39
  keyword_counts[keyword] = keyword_counts.get(keyword, 0) + 1
40
 
41
- # ν‚€μ›Œλ“œλ₯Ό λΉˆλ„ λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ ¬ (λΉˆλ„κ°€ κ°™μœΌλ©΄ ν‚€μ›Œλ“œ μ˜€λ¦„μ°¨μˆœ)
42
  sorted_keywords = sorted(keyword_counts.items(), key=lambda x: (-x[1], x[0]))
43
 
44
- # κ²°κ³Όλ₯Ό DataFrame으둜 생성 (A1μ…€: ν‚€μ›Œλ“œ, B1μ…€: λΉˆλ„)
45
  result_df = pd.DataFrame(sorted_keywords, columns=["ν‚€μ›Œλ“œ", "λΉˆλ„"])
46
 
47
- # μ—‘μ…€ 파일둜 κ²°κ³Όλ₯Ό 좜λ ₯ (A1, B1 셀에 헀더 μΆ”κ°€)
48
  output = BytesIO()
49
  try:
50
  with pd.ExcelWriter(output, engine="openpyxl") as writer:
51
- # 헀더 없이 A2μ…€λΆ€ν„° 데이터 μ €μž₯
52
  result_df.to_excel(writer, index=False, startrow=1, header=False)
53
  worksheet = writer.sheets["Sheet1"]
54
- # A1μ…€κ³Ό B1셀에 헀더 μž‘μ„±
55
  worksheet.cell(row=1, column=1, value="ν‚€μ›Œλ“œ")
56
  worksheet.cell(row=1, column=2, value="λΉˆλ„")
57
  output.seek(0)
58
  except Exception as e:
59
- return "μ—‘μ…€ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
 
 
 
 
 
60
 
61
- # μƒμ„±λœ μ—‘μ…€ 파일의 λ°”μ΄νŠΈ 데이터λ₯Ό λ°˜ν™˜ (λ‹€μš΄λ‘œλ“œ κ°€λŠ₯)
62
- return output.getvalue()
 
 
63
 
64
- # κ·ΈλΌλ””μ˜€ μΈν„°νŽ˜μ΄μŠ€ 생성
 
 
65
  iface = gr.Interface(
66
  fn=process_excel,
67
- inputs=gr.File(label="μ—‘μ…€ 파일 μ—…λ‘œλ“œ"),
68
- outputs=gr.File(label="κ²°κ³Ό μ—‘μ…€ 파일"),
 
 
 
69
  title="μ—‘μ…€ μƒν’ˆλͺ… ν‚€μ›Œλ“œ μΆ”μΆœ 및 λΉˆλ„ 뢄석",
70
  description=(
71
  "μ—‘μ…€ 파일의 D4μ…€λΆ€ν„° D열에 μžˆλŠ” μƒν’ˆλͺ… 데이터λ₯Ό λΆ„μ„ν•˜μ—¬, "
72
  "특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. "
73
  "ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ ν‚€μ›Œλ“œμ™€ λΉˆλ„λ₯Ό "
74
- "λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ¦¬ν•œ κ²°κ³Όλ₯Ό μ—‘μ…€ 파일둜 좜λ ₯ν•©λ‹ˆλ‹€."
75
  )
76
  )
77
 
 
1
+ python
2
+ 볡사
3
  import gradio as gr
4
  import pandas as pd
5
  import re
6
  from io import BytesIO
7
+ import tempfile
8
 
9
  def process_excel(file_bytes):
10
  """
11
  μ—…λ‘œλ“œλœ μ—‘μ…€ νŒŒμΌμ—μ„œ D4μ…€λΆ€ν„° Dμ—΄μ˜ μƒν’ˆλͺ…을 μΆ”μΆœν•˜μ—¬,
12
  각 μ…€μ—μ„œ 특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€.
13
  ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜κ³ , 전체 셀에 λŒ€ν•΄
14
+ ν‚€μ›Œλ“œμ˜ λΉˆλ„λ₯Ό κ³„μ‚°ν•˜μ—¬ μ—‘μ…€ 파일과 ν‘œ(λ°μ΄ν„°ν”„λ ˆμž„)둜 κ²°κ³Όλ₯Ό 좜λ ₯ν•©λ‹ˆλ‹€.
15
+ μ—λŸ¬ λ°œμƒ μ‹œ, μ—λŸ¬ λ©”μ‹œμ§€λ₯Ό ν…μŠ€νŠΈ 파일과 λ°μ΄ν„°ν”„λ ˆμž„ ν˜•νƒœλ‘œ λ°˜ν™˜ν•©λ‹ˆλ‹€.
16
  """
17
+ # μ—‘μ…€ 파일 읽기
18
  try:
 
19
  df = pd.read_excel(BytesIO(file_bytes), header=None, engine="openpyxl")
20
  except Exception as e:
21
+ error_message = "μ—‘μ…€ νŒŒμΌμ„ μ½λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
22
+ temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
23
+ temp_error.write(error_message.encode("utf-8"))
24
+ temp_error.close()
25
+ error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
26
+ return temp_error.name, error_df
27
 
28
+ # μ—‘μ…€ 파일 ν˜•μ‹ 체크 (μ΅œμ†Œ 4μ—΄, μ΅œμ†Œ 4ν–‰)
29
  if df.shape[1] < 4 or df.shape[0] < 4:
30
+ error_message = "μ—‘μ…€ 파일의 ν˜•μ‹μ΄ μ˜¬λ°”λ₯΄μ§€ μ•ŠμŠ΅λ‹ˆλ‹€."
31
+ temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
32
+ temp_error.write(error_message.encode("utf-8"))
33
+ temp_error.close()
34
+ error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
35
+ return temp_error.name, error_df
36
 
37
+ # Dμ—΄(4번째 μ—΄, 인덱슀 3)μ—μ„œ 4ν–‰(인덱슀 3)λΆ€ν„° 데이터λ₯Ό κ°€μ Έμ˜΄
38
  product_names_series = df.iloc[3:, 3]
39
  product_names_series = product_names_series.dropna()
40
 
 
43
  # λ¬Έμžμ—΄μ΄ μ•„λ‹Œ 경우 λ¬Έμžμ—΄λ‘œ λ³€ν™˜
44
  if not isinstance(cell, str):
45
  cell = str(cell)
46
+ # 특수문자 제거 (숫자, 영문, ν•œκΈ€, 곡백을 μ œμ™Έν•œ 문자 제거)
47
  cleaned = re.sub(r'[^0-9a-zA-Zκ°€-힣\s]', '', cell)
48
+ # 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œ 뢄리
49
  keywords = cleaned.split()
50
+ # ν•˜λ‚˜μ˜ μ…€ λ‚΄ 쀑볡 ν‚€μ›Œλ“œλŠ” 제거
51
  unique_keywords = set(keywords)
52
  for keyword in unique_keywords:
53
  keyword_counts[keyword] = keyword_counts.get(keyword, 0) + 1
54
 
55
+ # ν‚€μ›Œλ“œλ₯Ό λΉˆλ„ λ‚΄λ¦Όμ°¨μˆœ(λΉˆλ„κ°€ κ°™μœΌλ©΄ ν‚€μ›Œλ“œ μ˜€λ¦„μ°¨μˆœ)으둜 μ •λ ¬
56
  sorted_keywords = sorted(keyword_counts.items(), key=lambda x: (-x[1], x[0]))
57
 
58
+ # κ²°κ³Όλ₯Ό DataFrame으둜 생성 (A1: "ν‚€μ›Œλ“œ", B1: "λΉˆλ„")
59
  result_df = pd.DataFrame(sorted_keywords, columns=["ν‚€μ›Œλ“œ", "λΉˆλ„"])
60
 
61
+ # μ—‘μ…€ 파일 생성 (A1, B1 셀에 헀더 μΆ”κ°€)
62
  output = BytesIO()
63
  try:
64
  with pd.ExcelWriter(output, engine="openpyxl") as writer:
 
65
  result_df.to_excel(writer, index=False, startrow=1, header=False)
66
  worksheet = writer.sheets["Sheet1"]
 
67
  worksheet.cell(row=1, column=1, value="ν‚€μ›Œλ“œ")
68
  worksheet.cell(row=1, column=2, value="λΉˆλ„")
69
  output.seek(0)
70
  except Exception as e:
71
+ error_message = "μ—‘μ…€ νŒŒμΌμ„ μƒμ„±ν•˜λŠ” 쀑 였λ₯˜κ°€ λ°œμƒν•˜μ˜€μŠ΅λ‹ˆλ‹€: " + str(e)
72
+ temp_error = tempfile.NamedTemporaryFile(delete=False, suffix=".txt", mode="wb")
73
+ temp_error.write(error_message.encode("utf-8"))
74
+ temp_error.close()
75
+ error_df = pd.DataFrame({"μ—λŸ¬": [error_message]})
76
+ return temp_error.name, error_df
77
 
78
+ # μž„μ‹œ μ—‘μ…€ 파일 생성 ν›„ 경둜 λ°˜ν™˜
79
+ temp_excel = tempfile.NamedTemporaryFile(delete=False, suffix=".xlsx", mode="wb")
80
+ temp_excel.write(output.getvalue())
81
+ temp_excel.close()
82
 
83
+ return temp_excel.name, result_df
84
+
85
+ # κ·ΈλΌλ””μ˜€ μΈν„°νŽ˜μ΄μŠ€ 생성 (μ—‘μ…€ 파일과 κ²°κ³Ό ν‘œ 두 κ°€μ§€ ν˜•νƒœλ‘œ 좜λ ₯)
86
  iface = gr.Interface(
87
  fn=process_excel,
88
+ inputs=gr.File(label="μ—‘μ…€ 파일 μ—…λ‘œλ“œ", type="binary"),
89
+ outputs=[
90
+ gr.File(label="κ²°κ³Ό μ—‘μ…€ 파일"),
91
+ gr.DataFrame(label="ν‚€μ›Œλ“œ 뢄석 ν‘œ")
92
+ ],
93
  title="μ—‘μ…€ μƒν’ˆλͺ… ν‚€μ›Œλ“œ μΆ”μΆœ 및 λΉˆλ„ 뢄석",
94
  description=(
95
  "μ—‘μ…€ 파일의 D4μ…€λΆ€ν„° D열에 μžˆλŠ” μƒν’ˆλͺ… 데이터λ₯Ό λΆ„μ„ν•˜μ—¬, "
96
  "특수문자λ₯Ό μ œκ±°ν•œ ν›„ 곡백 κΈ°μ€€μœΌλ‘œ ν‚€μ›Œλ“œλ₯Ό μΆ”μΆœν•©λ‹ˆλ‹€. "
97
  "ν•œ μ…€ λ‚΄μ—μ„œ μ€‘λ³΅λœ ν‚€μ›Œλ“œλŠ” ν•œ 번만 μΉ΄μš΄νŠΈν•˜λ©°, μ΅œμ’…μ μœΌλ‘œ ν‚€μ›Œλ“œμ™€ λΉˆλ„λ₯Ό "
98
+ "λ‚΄λ¦Όμ°¨μˆœμœΌλ‘œ μ •λ¦¬ν•œ κ²°κ³Όλ₯Ό μ—‘μ…€ 파일과 ν‘œ(λ°μ΄ν„°ν”„λ ˆμž„)둜 좜λ ₯ν•©λ‹ˆλ‹€."
99
  )
100
  )
101