feat(810-1): 경쟁사 원파일 파서 — EST(.estx) · STmate(.stc) 구조 줄 · node · smt_parser 거울 대조

- M02_San_Estx: DBISAM 표 · BLOB 읽기(import-estx.cjs 거울) · 산근 · 일위대가 블록 → 구조 줄(LinkIndex 뜻 · SCheck 비목 · LineData 표지 · 기계 세 줄 · 산근 속 산근 · 자리) · 줄합 = 저장 결과만
- M02_San_Stc: COSTN.DBF · COSTN.SMT · BOQ11.DBF 읽기(smt_parser 거울) · 줄 풀이 = M02_San_Stmate 재사용 · BDQTY 난독화 표지 · Start8x.Ini 옵션 그대로
- 시험 test_810_1_estx · test_810_1_stc 34 통과 — 거울 다름 0(estx 6 · stc 7) · 블록 금액 = 저장값 100 %(EST 3,378 · STC 371) · 엑셀 엔진 대조(거창 줄 갈래 547 중 265 = 엑셀이 작업량 Q 를 상수로 봄)
- 꼴 문서 resources/master_data/_원파일파서_틀.md · 대조 목록 docs/raw/요구_1104/_목록_810-1_원파일대조.xlsx

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
2026-11-08 19:22:25 +09:00
co-authored by Claude Opus 5.5
parent e330025459
commit e794e0490c
6 changed files with 1133 additions and 0 deletions
@@ -0,0 +1,79 @@
# 경쟁사 원파일 파서 틀 (810-1)
읽기만 · 서버 단독 · 칸에 있는 것만 옮김(추정 0) · 없으면 비움 + 표지.
| 프로그램 | 파일 | 파서 | 거울(시험) |
| --- | --- | --- | --- |
| EST Plus | `.estx` = ZIP · DBISAM `.dat` + `.blb` | `M02_MasterTemplete/M02_San_Estx.py` | node `tools/est-test/import-estx.cjs` · `test_810_1_estx.py` |
| STmate | `.stc` = ZIP · COSTN.DBF · COSTN.SMT · BOQ11.DBF | `M02_MasterTemplete/M02_San_Stc.py` | `tools/stmate-test/smt_parser.py` · `test_810_1_stc.py` |
## 1. 돌려주는 꼴 — `read(bytes)`
| 칸 | 뜻 |
| --- | --- |
| 꼴 | `EST` · `STmate` |
| 산근 | 단가산출 블록 목록 |
| 일위 | 일위대가 블록 목록(STmate = 머리만 · 구성 못 읽음) |
| 자원 | 코드 → {종류 · 이름 · 규격 · 단위 · 저장 금액} (EST 열쇠 = `종류:코드`) |
| 내역 | STmate BOQ11 내역 줄 {번 · 이름 · 규격 · 단위 · 수량 · 코드 · 저장} · EST = None |
| 단가 · 옵션 | STmate 만 — 셈용 단가 {T L M S meta} · Start8x.Ini 키 = 값 그대로 |
| 표지 | 못 읽는 것 · 미확정 |
블록 = {코드 · 이름 · 규격 · 단위 · 저장 {T L M S (R)} · 줄 [구조 줄] · 줄합 · 표지}.
- 저장 = 원파일 제목 표 금액(EST CostTitleDat · HeadTitleDat TC NC GC JC SC · STmate COSTN TAMT1 LAMT1 MAMT1 SAMT1).
- 줄합 = 소수 그대로의 비목 합 — EST = 저장 결과 줄만(셈 없음) · STmate = `M02_San_Eval.run_stmate`.
- 비목 글자 = T 계 · L 노무 · M 재료 · S 경비 · R 실적(EST SC).
## 2. 구조 줄
| 칸 | EST 산근(CostMainDat) | EST 일위(HeadMainDat) | STmate 산근(COSTN.SMT 한 줄) |
| --- | --- | --- | --- |
| 행 | 블록 안 차례(머리 뺌) | 같음(빈 줄 뺌) | 원문 줄 차례 |
| 글 · 보임 | LineData · 제어문자 뺀 글 | — | 원문 · strip |
| 품명 · 규격 · 단위 | `\x0e` · `\x13` · `\x15` 첫 조각 | Name · Size · Unite | 비움 |
| 수량 | — | GN | — |
| 단 | Level | — | 계 단 1~5 |
| 연결 · 연결뜻 | LinkIndex · `LINK` 뜻 | 같음 | 줄 종류(빈 · 글 · 계 · 대입 · 참조 · 율) |
| 비목 | SCheck 음수 -1 L · -2 M · -3 S · -4 R · -5 T / 율 · 소계 양수 1 M · 2 L · 3 S · 4 R | 율 줄 SCheck | 참조 · 율 꼬리 L · M · S |
| 자원 | {코드 · 종류 · 표 · 이름 · 규격 · 단위 · 저장} | 같음 | {코드 · 종류 · 비목 · 옮김 · 이름 · 규격 · 단위 · 저장} |
| 연결단가 | `\x03` 수 | — | 비움 |
| 변수 | `\x11` 수(변수 참조 값) | — | 대입 이름 |
| 줄참조 | `\x0c` 수 | — | 율 번지 · 줄 번지 |
| 결과 | `\x12` 수 | — | 비움(원문에 결과 없음) |
| 합계 | `\x1a` 있음 | — | 계 줄 |
| 자리 | Diget · DigetIndex | 같음 | 비움 |
| 표지 | 율 · 소계 · 합계 | 율 · 소계 | 율 · 합계 |
| 기계 | 기계 세 줄 묶음 = 잇단 같은 Code + 105 + 비목 줄 · 첫 줄 행 | — | 기계 코드(X · E) |
| 산근 | LinkIndex 104 코드 | 같음 | D 코드 |
| 산출 · 단가 | — | CalcIndex · TU NU GU JU SU | — |
| 저장 | 줄 TC NC GC JC SC | 같음 | 비움 |
| 풀이 | — | — | `M02_San_Stmate.parse_line` 나무 그대로 |
## 3. 코드 · 연결 대응
| 종류 | EST LinkIndex · 표 | STmate 코드 머리 |
| --- | --- | --- |
| 자재 | 5 StuffcDat | M |
| 노임 | 6 LaborcDat | L |
| 표준(실적) | 21 SilJukDat | — |
| 견적 | 101 EstiMateDat | — |
| 일위 | 103 HeadTitleDat | B |
| 산근 | 104 CostTitleDat | D |
| 기계 | 105 MachTitleDat | X · E |
| 경비 | — | S |
| 소계 | 51 · 61 · 68 | `(=)` 계 |
| 율 | 52 · 58 · 62 | `&P..&` · `&R..&` |
## 4. 블록 합 규칙(시험이 저장값 100 % 로 지킴)
- EST 산근 — 합계 줄(`\x1a` · 율 62 밖)이 있으면 가장 바깥 단 비목 줄 결과 · 없으면 비목 줄 결과 합.
- EST 일위 — 줄 저장 금액 합(CalcIndex < 2) · 소계 68 · 율 52 줄에서 누계를 그 줄로 다시 시작.
- EST 끝전 — 버림 · 반올림 둘 중 하나(DigetIndex · 옵션 미해석).
- STmate — `M02_San_Eval.stmate_block` · 차수 1 단가 · 낙찰(UC · NAGCD) · 결과 조정(S_ADJ · SBMOK) · 끝전 갈래 = 옵션 SAN_TYP 1 비목버림 / 0 합버림_큰나머지(원파일 일곱 저장값 대조로 확인 · 이름 뜻 미확정).
## 5. 못 읽는 것
- EST — 옵션 파일(datestoption.opt) · 원가 서식(wongadat) · 기계 구성(MachMainDat) 은 구조 줄로 안 옮김.
- STmate — BDQTY.DBF(일위대가 구성) · SYSINFO.DBF 난독화 · 차수 2~4 금액 칸 안 옮김 · 코드 머리 W 뜻 모름.
- 원파일 없는 것(북부청 2 · 2016 사방 · 수목) = 엑셀 길.