100 lines
3.2 KiB
Python
100 lines
3.2 KiB
Python
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 '' |