feat: UNSTRING解析增强 + 跨FD数值统一 + 文件I/O模块
This commit is contained in:
+30
-5
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user