Files
Aislo/docs/raw/M01_점검/sub1_2/tools/merge_check.py
T

36 lines
1.8 KiB
Python

import json,glob,collections,re,os
P='tmp/M01_점검/sub1_2/part/'
rows={}
for f in sorted(glob.glob(P+'A?.jsonl')):
a=os.path.basename(f)[:2]
for l in open(f,encoding='utf-8'):
l=l.strip()
if not l: continue
r=json.loads(l); r['agent']=a
if r['키'] in rows: print('중복',r['키'],a,rows[r['키']]['agent'])
rows[r['키']]=r
MD='resources/master_data/'
scope={}
for g in ['소요량','계수']:
for f in glob.glob(MD+g+'_건설품셈_*.json'):
d=json.load(open(f,encoding='utf-8'))
if d.get('부문') in ('건축','유지관리'):
for t in d['표']: scope[t['키']]=(d['부문'],t['원문번호'],len(t['줄']),os.path.basename(f))
print(len(scope),len(rows),'빠짐',[k for k in scope if k not in rows][:20],'남는',[k for k in rows if k not in scope][:20])
print(sorted(collections.Counter((r['agent'],r['표값']) for r in rows.values()).items()))
print(collections.Counter(r['로직'] for r in rows.values()))
m=lambda s:re.match(r'^\s*(\d+)/(\d+)',s)
print('N/N 없는 끝남',[k for k,r in rows.items() if r['표값']=='끝남' and not m(r['근거'])][:20])
print('N≠N',[k for k,r in rows.items() if r['표값']=='끝남' and m(r['근거']) and m(r['근거']).group(1)!=m(r['근거']).group(2)][:20])
json.dump(rows,open('tmp/M01_점검/sub1_2/all_rows.json','w',encoding='utf-8'),ensure_ascii=False)
sel=[]
byag=collections.defaultdict(list)
for k,r in rows.items(): byag[r['agent']].append(k)
for a,ks in sorted(byag.items()):
for i in range(0,len(ks),10):
blk=ks[i:i+10]
if len(blk)<5 and i>0: continue
sel.append(max(blk,key=lambda k:scope[k][2]))
print(len(sel),sel)
json.dump({'sel':sel,'scope':scope},open('tmp/M01_점검/sub1_2/recheck_sel.json','w',encoding='utf-8'),ensure_ascii=False)