I have a dataset with attributes where in two columns the start and end of a range (postalcode)
is it possible to duplicate the attributes with the missing postalcodes?
example:
range tels me:
from 7595AM to 7595AP
there are 2 postalcodes missing. 7595AN and 7595AO.
from this attribute i would like to duplicate it to 4 attributes for each of the seperate postalcodes.
thanx in advance.
i am using FME Form 2024.1
Page 1 / 1
Firstly, thanks to ChatGPT for helping with this - credit where credit is due!
The below python code will return a feature with an attribute new_code containing each of the missing codes between the specified start and end ones. In you python caller, make sure you expose new_code
def increment_code(self, code): # Split the code into numeric and alphabetic parts numeric_part = int(code[:4]) alpha_part = code[4:]
# Convert alpha part to number alpha_number = (ord(alpha_part[0]) - ord('A')) * 26 + (ord(alpha_part[1]) - ord('A'))
# Increment alpha number alpha_number += 1
# If alpha number exceeds the range, reset and increment numeric part if alpha_number >= 26 * 26: alpha_number = 0 numeric_part += 1
# Convert back to code new_alpha_part = chr(alpha_number // 26 + ord('A')) + chr(alpha_number % 26 + ord('A')) return f"{numeric_part:04d}{new_alpha_part}"
def input(self, feature: fmeobjects.FMEFeature): start = feature.getAttribute('postcode_van') end = feature.getAttribute('postcode_tot')
curr = self.increment_code(start)
while curr != end: feature.setAttribute('new_code', curr) self.pyoutput(feature) curr = self.increment_code(curr)
def close(self): pass
def process_group(self): pass
Having done similar in FME, then I’ve used Cloner for this.
Steps would be:
Convert the Postcode AlphaNumerics into Pure Numbers. Effectively the form you have is that each “Number” is a Decimal Number 0-9 , or a Letter Number A-Z (26 Letter Numbers). This 10+26 = A Base36 Number
Convert the PostCode Base36 “Numbers” into Decimal Numbers (Base10) using BaseConvertor
Use Cloner to create the extra intermediate features/rows based on the Difference between the Base10 postcode_tot_decimal number and the Base 10 postcode_vav_decimal number
Use AttributeCreator to set each new Feature/Row to a “postcode_sequence” number being postcode_van_decimal + the Cloner Sequence Number
Back convert the postcode_sequence Decimal Numbers (Base10) back to Base36 to get them back into Postcode Alphanumeric Format.
ListBuilder to wrap it into a List (Grouping into Lists effectively dissolves the Features into special List Attributes horizontally on the Feature)
Join the calculated Lists back into the Source Features with FeatureJoiner
*Edit*
Extra little Tester step to handle when an “Intermediate” Postcode has a 0-9 Number in either the 5th character or the 6th character, which is invalid.
Thanks for the options.
I tried both of them.
in my proces within FME option 1 worked well.
i just had to implement de postcode_van en postcode_tot.
The second one keeps running and gave me an out of memory.