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
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
| # 42jerrykim.github.io에서 더 많은 정보를 확인 할 수 있다
from abc import ABC, abstractmethod
from typing import List, Dict, Any
# AbstractClass - 데이터 마이닝 템플릿
class DataMiner(ABC):
"""데이터 마이닝 알고리즘의 템플릿"""
def mine(self, path: str) -> Dict[str, Any]:
"""템플릿 메서드 - 알고리즘의 골격"""
raw_data = self.extract_data(path)
parsed_data = self.parse_data(raw_data)
if self.should_analyze(): # 훅 메서드
analysis = self.analyze_data(parsed_data)
else:
analysis = {}
report = self.create_report(parsed_data, analysis)
self.send_report(report) # 콘크리트 메서드
return report
@abstractmethod
def extract_data(self, path: str) -> str:
"""원시 연산 - 데이터 추출"""
pass
@abstractmethod
def parse_data(self, raw_data: str) -> List[Dict]:
"""원시 연산 - 데이터 파싱"""
pass
def analyze_data(self, data: List[Dict]) -> Dict[str, Any]:
"""콘크리트 연산 - 기본 분석 (오버라이드 가능)"""
return {
"count": len(data),
"summary": "기본 분석 완료"
}
@abstractmethod
def create_report(self, data: List[Dict], analysis: Dict) -> Dict[str, Any]:
"""원시 연산 - 리포트 생성"""
pass
def send_report(self, report: Dict[str, Any]) -> None:
"""콘크리트 연산 - 리포트 전송 (공통)"""
print(f"📤 리포트 전송 완료: {report.get('title', 'Unknown')}")
def should_analyze(self) -> bool:
"""훅 메서드 - 분석 수행 여부 (기본값: True)"""
return True
# ConcreteClass - CSV 마이너
class CSVMiner(DataMiner):
"""CSV 파일 마이닝"""
def extract_data(self, path: str) -> str:
print(f"📂 CSV 파일 읽기: {path}")
# 실제로는 파일을 읽음
return "name,age,city\nAlice,30,Seoul\nBob,25,Busan\nCharlie,35,Incheon"
def parse_data(self, raw_data: str) -> List[Dict]:
print("📊 CSV 데이터 파싱 중...")
lines = raw_data.strip().split('\n')
headers = lines[0].split(',')
data = []
for line in lines[1:]:
values = line.split(',')
data.append(dict(zip(headers, values)))
print(f" 파싱 완료: {len(data)}개 레코드")
return data
def create_report(self, data: List[Dict], analysis: Dict) -> Dict[str, Any]:
return {
"title": "CSV 데이터 리포트",
"type": "csv",
"records": len(data),
"analysis": analysis
}
# ConcreteClass - JSON 마이너
class JSONMiner(DataMiner):
"""JSON 파일 마이닝"""
def extract_data(self, path: str) -> str:
print(f"📂 JSON 파일 읽기: {path}")
return '[{"name": "Alice", "score": 95}, {"name": "Bob", "score": 87}]'
def parse_data(self, raw_data: str) -> List[Dict]:
import json
print("📊 JSON 데이터 파싱 중...")
data = json.loads(raw_data)
print(f" 파싱 완료: {len(data)}개 레코드")
return data
def analyze_data(self, data: List[Dict]) -> Dict[str, Any]:
"""커스텀 분석 로직"""
scores = [d.get('score', 0) for d in data if 'score' in d]
return {
"count": len(data),
"average_score": sum(scores) / len(scores) if scores else 0,
"max_score": max(scores) if scores else 0
}
def create_report(self, data: List[Dict], analysis: Dict) -> Dict[str, Any]:
return {
"title": "JSON 데이터 리포트",
"type": "json",
"records": len(data),
"analysis": analysis
}
# ConcreteClass - PDF 마이너 (분석 건너뛰기)
class PDFMiner(DataMiner):
"""PDF 파일 마이닝"""
def extract_data(self, path: str) -> str:
print(f"📂 PDF 파일 읽기: {path}")
return "PDF 텍스트 내용..."
def parse_data(self, raw_data: str) -> List[Dict]:
print("📊 PDF 텍스트 파싱 중...")
# 간단히 문단으로 분리
paragraphs = raw_data.split('...')
return [{"content": p.strip()} for p in paragraphs if p.strip()]
def create_report(self, data: List[Dict], analysis: Dict) -> Dict[str, Any]:
return {
"title": "PDF 텍스트 리포트",
"type": "pdf",
"paragraphs": len(data),
"analysis": analysis
}
def should_analyze(self) -> bool:
"""PDF는 분석 건너뛰기"""
print(" ⏭ PDF 분석 건너뛰기")
return False
# 사용 예제
if __name__ == "__main__":
print("=== CSV 마이닝 ===")
csv_miner = CSVMiner()
csv_report = csv_miner.mine("data.csv")
print(f"결과: {csv_report}\n")
print("=== JSON 마이닝 ===")
json_miner = JSONMiner()
json_report = json_miner.mine("data.json")
print(f"결과: {json_report}\n")
print("=== PDF 마이닝 ===")
pdf_miner = PDFMiner()
pdf_report = pdf_miner.mine("document.pdf")
print(f"결과: {pdf_report}")
|