fix bug and refine ,end of 2025
This commit is contained in:
65
epanet/fix_valve_ids2.py
Normal file
65
epanet/fix_valve_ids2.py
Normal file
@@ -0,0 +1,65 @@
|
||||
#!/usr/bin/env python3
|
||||
from pathlib import Path
|
||||
import re
|
||||
|
||||
inp = Path(r"d:\TJWaterServer\epanet\szhskeleton-patternfixed-ascii.inp")
|
||||
text = inp.read_text(encoding='utf-8')
|
||||
lines = text.splitlines()
|
||||
|
||||
start = None
|
||||
for i,l in enumerate(lines):
|
||||
if l.strip().upper() == '[VALVES]':
|
||||
start = i
|
||||
break
|
||||
if start is None:
|
||||
print('No [VALVES] section found')
|
||||
raise SystemExit(1)
|
||||
# collect until next section header or EOF
|
||||
end = len(lines)
|
||||
for j in range(start+1, len(lines)):
|
||||
if re.match(r"^\s*\[.+\]", lines[j]):
|
||||
end = j
|
||||
break
|
||||
block_lines = lines[start+1:end]
|
||||
|
||||
ids = []
|
||||
for idx,l in enumerate(block_lines, start=start+1):
|
||||
if not l.strip() or l.strip().startswith(';'):
|
||||
continue
|
||||
# first token
|
||||
tok = l.split()[0]
|
||||
ids.append((idx, tok, l))
|
||||
|
||||
from collections import defaultdict
|
||||
count = defaultdict(list)
|
||||
for ln, tok, l in ids:
|
||||
count[tok].append(ln)
|
||||
|
||||
dups = {k:v for k,v in count.items() if len(v)>1}
|
||||
print('Total valve entries found:', len(ids))
|
||||
print('Duplicate token count:', len(dups))
|
||||
if dups:
|
||||
print('\nSample duplicates:')
|
||||
for k,v in list(dups.items())[:20]:
|
||||
print(k, 'lines:', v)
|
||||
|
||||
# show whether tokens are purely digits
|
||||
num_only = [tok for ln,tok,l in ids if re.fullmatch(r'\d+', tok)]
|
||||
print('\nNumeric-only valve IDs count:', len(num_only))
|
||||
|
||||
# show examples of numeric-only
|
||||
if num_only:
|
||||
print('Examples:', num_only[:20])
|
||||
|
||||
# write a short report
|
||||
rep = inp.with_name(inp.stem + '-valves-report.txt')
|
||||
with rep.open('w', encoding='utf-8') as f:
|
||||
f.write(f'Total valve entries: {len(ids)}\n')
|
||||
f.write(f'Duplicate tokens: {len(dups)}\n')
|
||||
for k,v in dups.items():
|
||||
f.write(f'{k}: lines {v}\n')
|
||||
f.write('\nNumeric-only tokens:\n')
|
||||
for tok in sorted(set(num_only)):
|
||||
f.write(tok + '\n')
|
||||
|
||||
print('Wrote report to', rep)
|
||||
Reference in New Issue
Block a user