auto: 2026-09-02 16:48 (EOMSANGDON-HOME)

This commit is contained in:
2026-09-02 16:48:22 +09:00
parent b4c7a7eedb
commit 397a135073
192 changed files with 6816 additions and 6014 deletions
@@ -13,6 +13,7 @@
- 품셈: 부문 표제 라인·목차 구역은 자동 탐지하지만 결과 요약(장 수)이 목차와 일치하는지 확인
- 공통: 원문 PDF 프로즈는 어절 공백이 붙는 특성 있음(값·표는 정상) — W5 공백 기준 예외로 기록
"""
import re
import sys
from pathlib import Path
@@ -25,8 +26,13 @@ BASE = Path(__file__).resolve().parent.parent / "원가계산"
# ────────────────────────── 건협 노임 ──────────────────────────
CAK_DIR = "노임단가_건설업_대한건설협회"
CAK_STEM = "2026상반기_건설업_임금실태조사_대한건설협회"
PAGE_TABLE = (9, 13) # 0-based: 원문 p.10~13 = 개별직종 노임단가 표
CAK_CH = [("1. 조사개요", 1), ("2. 임금적용요령", 5), ("3. 개별직종 노임단가", 9), ("4. 직종해설", 13)]
PAGE_TABLE = (9, 13) # 0-based: 원문 p.10~13 = 개별직종 노임단가 표
CAK_CH = [
("1. 조사개요", 1),
("2. 임금적용요령", 5),
("3. 개별직종 노임단가", 9),
("4. 직종해설", 13),
]
CAK_COLS = "| 직종코드 | 직종명 | 신뢰도 | 2026.1.1 | 2025.9.1 | 2025.1.1 | 2024.9.1 |"
@@ -51,8 +57,10 @@ def parse_cak_table():
if code not in result and len(slots) == 4 and name:
result[code] = (name, slots, flag)
rows = [CAK_COLS, "|---|---|---|---|---|---|---|"]
rows += [f"| {c} | {result[c][0]} | {result[c][2]} | {' | '.join(result[c][1])} |"
for c in sorted(result)]
rows += [
f"| {c} | {result[c][0]} | {result[c][2]} | {' | '.join(result[c][1])} |"
for c in sorted(result)
]
return len(result), "\n".join(rows) + "\n"
@@ -72,27 +80,36 @@ def split_cak():
if starts[0][1] is None:
starts[0] = (starts[0][0], 0)
assert all(s[1] is not None for s in starts), starts
hdr = (f"> 원문: {CAK_STEM}.pdf (대한건설협회, 공표 2025-12-31, 적용 2026-01-01)\n"
"> 변환: pdf2md + 표 정밀 파싱. ⚠ 본문 프로즈는 원문 PDF 특성상 어절 공백이 붙어 있음 — 값·표는 정상.\n\n")
hdr = (
f"> 원문: {CAK_STEM}.pdf (대한건설협회, 공표 2025-12-31, 적용 2026-01-01)\n"
"> 변환: pdf2md + 표 정밀 파싱. ⚠ 본문 프로즈는 원문 PDF 특성상 어절 공백이 붙어 있음 — 값·표는 정상.\n\n"
)
for i, (fname, st) in enumerate(starts):
en = starts[i + 1][1] if i + 1 < len(starts) else len(lines)
body = "\n".join(lines[st:en]).strip()
if "개별직종" in fname:
body = ("## Ⅲ. 개별직종 노임단가 (1일 8시간 기준, 원)\n\n"
f"> PDF 좌표·스트림 정밀 파싱으로 재구성 — {cnt}개 직종 전수, 최근 4개 공표일 병기.\n"
"> `-` = 해당 공표일 미공표(표본 부족·신설 등). 원문 각주는 PDF 참조.\n"
"> **신뢰도** 열 = 원문이 직종번호 앞에 붙이는 기호 — `*` 조사현장 5개 미만(적용 시 유의), "
"`**` 미조사(임금적용요령 Ⅱ 참조). 빈칸 = 정상 공표.\n\n" + table)
body = (
"## Ⅲ. 개별직종 노임단가 (1일 8시간 기준, 원)\n\n"
f"> PDF 좌표·스트림 정밀 파싱으로 재구성 — {cnt}개 직종 전수, 최근 4개 공표일 병기.\n"
"> `-` = 해당 공표일 미공표(표본 부족·신설 등). 원문 각주는 PDF 참조.\n"
"> **신뢰도** 열 = 원문이 직종번호 앞에 붙이는 기호 — `*` 조사현장 5개 미만(적용 시 유의), "
"`**` 미조사(임금적용요령 Ⅱ 참조). 빈칸 = 정상 공표.\n\n" + table
)
(BASE / CAK_DIR / f"{fname}.md").write_text(
f"# {fname.split('. ', 1)[1]}\n\n{hdr}{body}\n", encoding="utf-8")
f"# {fname.split('. ', 1)[1]}\n\n{hdr}{body}\n", encoding="utf-8"
)
print("wrote", fname)
# ────────────────────────── 중기중앙회 노임 ──────────────────────────
KBIZ_DIR = "노임단가_제조업_중소기업중앙회"
KBIZ_STEM = "2026상반기_중소제조업_직종별_임금조사_중소기업중앙회"
KBIZ_CH = [("1. 조사개요", 1), ("2. 조사결과 요약", 12), ("3. 직종별 조사노임", 18),
("4. 직종코드 및 직종명 해설", 30)]
KBIZ_CH = [
("1. 조사개요", 1),
("2. 조사결과 요약", 12),
("3. 직종별 조사노임", 18),
("4. 직종코드 및 직종명 해설", 30),
]
def split_kbiz():
@@ -102,13 +119,16 @@ def split_kbiz():
if starts[0][1] is None:
starts[0] = (starts[0][0], 0)
assert all(s[1] is not None for s in starts), starts
hdr = (f"> 원문: {KBIZ_STEM}.pdf (중소기업중앙회, 공표 2026-06-30, 적용 2026-07-01)\n"
"> 변환: pdf2md. 표·수치 정상. `*` = 표본 부족 미공표, `**` = 원문 각주 참조.\n\n")
hdr = (
f"> 원문: {KBIZ_STEM}.pdf (중소기업중앙회, 공표 2026-06-30, 적용 2026-07-01)\n"
"> 변환: pdf2md. 표·수치 정상. `*` = 표본 부족 미공표, `**` = 원문 각주 참조.\n\n"
)
for i, (fname, st) in enumerate(starts):
en = starts[i + 1][1] if i + 1 < len(starts) else len(lines)
body = "\n".join(lines[st:en]).strip()
(BASE / KBIZ_DIR / f"{fname}.md").write_text(
f"# {fname.split('. ', 1)[1]}\n\n{hdr}{body}\n", encoding="utf-8")
f"# {fname.split('. ', 1)[1]}\n\n{hdr}{body}\n", encoding="utf-8"
)
print("wrote", fname)
@@ -121,8 +141,13 @@ def split_pumsem():
lines = (BASE / PUM_DIR / f"{PUM_STEM}.md").read_text(encoding="utf-8").splitlines()
# 부문 표제 위치 자동 탐지 (짧은 단독 라인)
sec_names = [("01_공통부문", "공통부문"), ("02_토목부문", "토목부문"), ("03_건축부문", "건축부문"),
("04_기계설비부문", "기계설비부문"), ("05_유지관리부문", "유지관리부문")]
sec_names = [
("01_공통부문", "공통부문"),
("02_토목부문", "토목부문"),
("03_건축부문", "건축부문"),
("04_기계설비부문", "기계설비부문"),
("05_유지관리부문", "유지관리부문"),
]
hits = {}
for i, l in enumerate(lines):
s = re.sub(r"[\s#>\-·ㆍ]", "", l)
@@ -170,11 +195,14 @@ def split_pumsem():
outdir.mkdir(exist_ok=True)
for j, (n, nm, st) in enumerate(starts):
en = starts[j + 1][2] if j + 1 < len(starts) else b
hdr = (f"# {sec[3:]} 제{n}장 {nm}\n\n"
f"> 원문: {PUM_STEM}.pdf (국토교통부 공고, 2026년 적용) — pdf2md 변환\n"
"> ⚠ 장 경계는 표제 탐지 기준 — 앞뒤 1페이지 내외 겹침 가능. 수치 검증 시 원본 PDF 대조.\n\n")
hdr = (
f"# {sec[3:]} 제{n}장 {nm}\n\n"
f"> 원문: {PUM_STEM}.pdf (국토교통부 공고, 2026년 적용) — pdf2md 변환\n"
"> ⚠ 장 경계는 표제 탐지 기준 — 앞뒤 1페이지 내외 겹침 가능. 수치 검증 시 원본 PDF 대조.\n\n"
)
(outdir / f"제{n}장_{nm}.md").write_text(
hdr + "\n".join(lines[st:en]).strip() + "\n", encoding="utf-8")
hdr + "\n".join(lines[st:en]).strip() + "\n", encoding="utf-8"
)
print(sec, f"{len(starts)}/{len(names)} 장")