Co-Authored-By: Claude Fable 5.1 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01KYNJBegcapQYMwkKAf8D7S
36 lines
1.8 KiB
Python
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)
|