I've got a table with a field named Maintenance Tasks. I would like to parse the values in this field into separate fields (Task1, Task2 etc.):
I can use:
None if !MaintenanceTasks! == None else !MaintenanceTasks!.split(',')
and this will parse the first item correctly into Task1, it also accounts for any null values in MaintenanceTasks.
The problem I'm running into is, for example, OID 23 above, when there's just a single item in the MaintenanceTasks field (ReplaceHead).
Any help would be greatly appreciated. FWIW I'll be scripting in Python.
a = ['a, b', 'c'] for i in a: # ---- split works properly, always returning a list print(i.split(",")) ['a', ' b'] ['c'] for i in a: # ---- as evidenced below print(i.split(",")) a c
You can always use a code block rather than the 'smokin' one-liner
def splitter(a): """ """ if i is None: return None else: return i.split(',') # ---- expression splitter(!YourFieldNameHere!)
In terms of style, None is a singleton so the idiomatic way to work with it is var is None. For the Task1 field, I would go with:
!MaintenanceTasks!.split(',') if !MaintenanceTasks! else None
For the Task2 field, I would try:
!MaintenanceTasks!.split(',') if !MaintenanceTasks! and ',' in !MaintenanceTasks! else None
n = None "," in n Traceback (most recent call last): File "<ipython-input-22-0746bac53200>", line 1, in <module> "," in n TypeError: argument of type 'NoneType' is not iterable # ---- BUT str, comes to the rescue "," in str(n) False # --- amend the smokin' oneliner appropriately
The first part of the logical check prevents the TypeError:
>>> n = None >>> n and "," in n >>> >>> n = 'string' >>> n and "," in n False >>> >>> n = 'string,' >>> n and "," in n True >>>
Seeing you have several fields, it really is a job better suited for ArcPy and an update cursor rather than the Field Calculator. That said, if you will only do this once and be done, then maybe a slightly clunky and manual way with the field calculator makes sense instead of learning how to script.
I believe the following will work, just increment the numbers starting with 0 for each new field:
!MaintenanceTasks!.split(',') if !MaintenanceTasks! and !MaintenanceTasks!.count(',') >= 0 else None
For example, Task1 will use 0, Task2 will use 1, Task3 will use 2, etc....
To add to Dan's comment: are you absolutely, 100% sure that the Maintenance Tasks values are comma separated? You may want to check for that. (Not that I've ever been burned by something like that...)
I also notice that OID 17 has three elements. Since you can't control how many elements you'll be presented (None through N), you may want to weave a len() method into your approach to determine how many elements you'll be extracting and which subsequent fields you'll be populating.
Thanks Joe, it is a comma - these are coming in from a list of check boxes in Survey123.
And you're right - I have up to 7 tasks in this field, so I'll need to look into the len() method.