0

In my attribute table I have a column named 'BYGN_STAT' which includes information about building status (RA, IG, FA etc.) and dates (YYYYMMDD).

I would like to split this column, and separate building status 'IG' with the following dates. The length of the dates varies from one date to many.

I need to find 'IG' and the following dates before the next to letters. In this case this is 'FA', but it could also be another combination of two letters.

In the figure below I would like to find and copy the values in the red rectangle to a new column. Is this possible?

enter image description here

2
  • 1
    Are you trying to use the Python Parser of the ArcGIS Field Calculator or an ArcPy cursor?
    – PolyGeo
    Sep 6, 2017 at 11:40
  • 1
    If the number of indexes (characters) are always the same for each row (strictly formatted) then slicing would be the easiest.
    – NULL.Dude
    Sep 6, 2017 at 12:37

1 Answer 1

2

If the string is structured in this way throughout the field, try using text slicing to return part of the string. See link for more information.

Using a dictionary, we can identify the text elements within the string that we need to find positions for. Then using the string.find() function, we can identify their indexes. Then use these to find the text in between each.

Try the following:

arcpy.AddField_management(fc, "New_Field", "TEXT")
d = {"RA" : 0, "IG": 0, "FA": 0}

with arcpy.da.UpdateCursor(fc, ["BYGN_STAT", "New_Field"]) as cursor:
    for row in cursor:
        string = str(row[0])
        d["RA"] = string.find("RA")
        d["IG"] = string.find("IG")
        d["FA"] = string.find("FA")
        ra = string[d["RA"]: d["IG"]-1]
        ig = string[d["IG"]: d["FA"]-1]
        fa = string[d["FA"]:]

        print ig
        row[1] = ig
        cursor.updateRow(row)           
5
  • IG = row[0][19:38] will not work as I don't know where in the field IG will be in each row. In this case IG is between 19:38, but IG could be anywhere in the field.
    – gobrandal
    Sep 6, 2017 at 10:55
  • ive updated the code
    – MacroZED
    Sep 6, 2017 at 11:07
  • Almost, but as I mention I don't know the length of the IG. The length of the dates varies from one date to many. I only know that it ends when a new letter appears or the field after is empty (shown in the first row in the example picture).
    – gobrandal
    Sep 6, 2017 at 11:38
  • What are the letters that will always appear? A dictionary can be used to identify the indexes of these within a string and then calculate accordingly.
    – MacroZED
    Sep 6, 2017 at 11:45
  • Nice! (I had to change Add.Field to AddField_management). To make it more universal/robust, it would have been great to implement to more functions: 1) Letters that can appear are: TB, RA, IG, FA, MP. A "check if exist"-test would be useful. 2) The order of these two letter combinations can differ from row to row. Since I don't know which two letter combination that is placed before and after IG It would have been useful to sort the dict after the "string.find" sequence. Then the code would be perfect
    – gobrandal
    Sep 7, 2017 at 10:25

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Not the answer you're looking for? Browse other questions tagged or ask your own question.