import pandas as pd import re def _is_hub_pattern(tagname): """Check if TAGNAME matches hub patterns like FIO1H1, FIO2H3, etc.""" # Match patterns like FIO1H1, FIO2H3, etc. hub_pattern = re.compile(r'FIO(\d+)?H\d+', re.IGNORECASE) return bool(hub_pattern.search(tagname)) def normalize_io_term(term): """Handle IO term variations like IO1 vs IO01""" if pd.isna(term): return [] term_str = str(term).upper() variations = [term_str] # Handle IO padding variations if term_str.startswith('IO') and len(term_str) > 2: num_part = term_str[2:] if num_part.isdigit(): # Add both padded and unpadded versions unpadded = f"IO{int(num_part)}" # Remove leading zeros padded = f"IO{num_part.zfill(2)}" # Ensure 2-digit padding variations.extend([unpadded, padded]) return list(set(variations)) # Remove duplicates def normalize_name(name): if pd.isna(name): return name return re.sub(r'\d+', lambda m: str(int(m.group(0))), str(name)) def normalize_vfd_name(name): """Only normalize VFD names, preserve others as-is""" if pd.isna(name): return name name_str = str(name).upper() if 'VFD' in name_str: return normalize_name(name) return str(name) def normalize_io_path(path): if pd.isna(path): return path path_str = str(path) if ':' in path_str: prefix, suffix = path_str.split(':', 1) # Only normalize VFD paths if 'VFD' in prefix.upper(): normalized_prefix = normalize_name(prefix) return f"{normalized_prefix}:{suffix}" return path_str return path_str def assign_partnumber(row): tagname = str(row['TAGNAME']).upper() existing_partnumber = row['PARTNUMBER'] # If there's already a valid part number, keep it if pd.notna(existing_partnumber) and existing_partnumber != '': return existing_partnumber # Only assign default part numbers if no existing part number # Hub devices (FIOH or FIO1H1, FIO2H3 patterns) if 'FIOH' in tagname or _is_hub_pattern(tagname): return 'TBIL-M1-16DXP' # DPM devices (only if contains DPM but NOT FIO) elif 'DPM' in tagname and 'FIO' not in tagname: return 'OS30-002404-2S' # PMM devices elif 'PMM' in tagname: return '1420-V2-ENT' # SIO devices elif 'SIO' in tagname: return '0980SSL3131-121-007D-202' # IB16S devices (check before IB16 to avoid conflict) elif 'IB16S' in tagname: return '1756-IB16S' # IB16 devices elif 'IB16' in tagname: return '1756-IB16' # OB16E devices elif 'OB16E' in tagname: return '1756-OB16E' else: return '' def combine_desc(row): desca = str(row['DESCA']) if pd.notna(row['DESCA']) and row['DESCA'] != '' else '' descb = str(row['DESCB']) if pd.notna(row['DESCB']) and row['DESCB'] != '' else '' if desca and descb: return f"{desca} {descb}" elif desca: return desca elif descb: return descb else: return ''