feat: UNSTRING解析增强 + 跨FD数值统一 + 文件I/O模块

This commit is contained in:
hangshuo652
2026-06-30 22:14:47 +08:00
parent 2f61ad7f1a
commit b3d1643220
7 changed files with 980 additions and 14 deletions
+30 -5
View File
@@ -1068,11 +1068,31 @@ class _BrParser:
source_part = m.group(1).strip()
targets_part = m.group(2).strip()
source_vars = re.findall(r'[A-Z][A-Z0-9-]*', source_part)
targets = re.findall(r'[A-Z][A-Z0-9-]*', targets_part)
targets_clean = re.sub(r'\s+(DELIMITER|COUNT|TALLYING)\s+IN\s+[A-Z][A-Z0-9-]*', '', targets_part, flags=re.IGNORECASE)
targets = re.findall(r'[A-Z][A-Z0-9-]*', targets_clean)
source_var = source_vars[0] if source_vars else ''
# Extract delimiter: DELIMITED BY <literal|identifier|SIZE>
delimiter = None
dm = re.search(r'DELIMITED\s+BY\s+(.+)', source_part, re.IGNORECASE)
if dm:
delim_raw = dm.group(1).strip()
if delim_raw.upper().startswith('SIZE'):
delimiter = None
elif delim_raw.startswith("'") or delim_raw.startswith('"'):
delimiter = delim_raw[1:-1] if len(delim_raw) >= 2 else None
else:
fid = re.match(r'[A-Z][A-Z0-9-]*', delim_raw, re.IGNORECASE)
delimiter = fid.group(0) if fid else None
seq = BrSeq()
for tgt in targets:
info = {'type': 'unstring_split', 'source_vars': [source_var], 'index': targets.index(tgt)}
info = {
'type': 'unstring_split',
'source_vars': [source_var],
'index': targets.index(tgt),
'delimiter': delimiter,
}
self.assignments.setdefault(tgt, []).append(info)
seq.add(Assign(tgt, info))
return seq
@@ -1660,6 +1680,7 @@ def propagate_assignments(rec, assignments, fields, file_sec=None):
src_var = asgn.get('source_vars', [None])[0]
resolved_src = _resolve_subscript(src_var, rec) if src_var else None
idx = asgn.get('index', 0)
delimiter = asgn.get('delimiter')
if resolved_src and resolved_src not in rec:
children = _init_child_names(resolved_src, fields)
if children:
@@ -1667,10 +1688,14 @@ def propagate_assignments(rec, assignments, fields, file_sec=None):
if resolved_src and resolved_src in rec:
src_val = str(rec[resolved_src])
ftype = pi.get('type', 'unknown')
if idx == 0:
val = src_val
if delimiter is not None:
segments = src_val.split(delimiter)
if idx < len(segments):
val = segments[idx].strip()
else:
val = ' ' if ftype in ('alphanumeric', 'alphabetic') else '0'
else:
val = ' ' if ftype in ('alphanumeric', 'alphabetic') else '0'
val = src_val if idx == 0 else (' ' if ftype in ('alphanumeric', 'alphabetic') else '0')
if ftype in ('alphanumeric', 'alphabetic'):
val = val.ljust(pi.get('length', len(val)))[:pi.get('length', len(val))]
rec[resolved_tgt] = val