Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

Extract last sequence of numerical value from string

I have a process that works but it is rather inelegant. I'm sure there must be a better way to do this.

 

In a certain column, the last several characters might be numbers. If the length of a number sequence is four, five, or six characters then I need to extract that sequence into a new column. If the length of final sequence numbers is less than four characters, then nothing should be extracted. There may be numbers at the beginning of the string and/or in the middle but only the numerical characters at the end of the string are of interest.

 

There is not a constant delimiter. There may or may not be a space between the last alpha character and the first numerical character. There might or might not be a symbol chacacter, such as a colon or a dash.

 

ColumnA                                     NewColumn

TEXT TEXT TEXT 123456             123456

TEXT TEXT TEXT TEXT 1234        1234

TEXT TEXT TEXT12345                 12345

TEXT 123 TEXT TEXT-123456       123456

1234 TEXT TEXT TEXT:12345        12345

TEXT TEXT TEXT TEXT 123            null

1234 TEXT TEXT TEXT 1                null

TEXT TEXT 123456 TEXT               null

  • You may use below in a custom column

     

    = if Text.Select(Text.End([ColumnA],6),{"0".."9"})=Text.End([ColumnA],6) then Text.End([ColumnA],6) 
    else if Text.Select(Text.End([ColumnA],5),{"0".."9"})=Text.End([ColumnA],5) then Text.End([ColumnA],5)
    else if Text.Select(Text.End([ColumnA],4),{"0".."9"})=Text.End([ColumnA],4) then Text.End([ColumnA],4)
    else null

     

    EDIT - Another alternative construct is this which is more flexible

     

    =[a=List.LastN(List.Transform(Text.ToList([ColumnA]),(x)=>if Text.Contains(Text.Combine({"0".."9"}),x) then x else null), each _ <> null),
    b=if List.Count(a)<4 then null else Text.Combine(a)][b]

     

     

2 Replies

  • Vijay_A_Verma's avatar
    Vijay_A_Verma
    Most Valuable Professional

    You may use below in a custom column

     

    = if Text.Select(Text.End([ColumnA],6),{"0".."9"})=Text.End([ColumnA],6) then Text.End([ColumnA],6) 
    else if Text.Select(Text.End([ColumnA],5),{"0".."9"})=Text.End([ColumnA],5) then Text.End([ColumnA],5)
    else if Text.Select(Text.End([ColumnA],4),{"0".."9"})=Text.End([ColumnA],4) then Text.End([ColumnA],4)
    else null

     

    EDIT - Another alternative construct is this which is more flexible

     

    =[a=List.LastN(List.Transform(Text.ToList([ColumnA]),(x)=>if Text.Contains(Text.Combine({"0".."9"}),x) then x else null), each _ <> null),
    b=if List.Count(a)<4 then null else Text.Combine(a)][b]

     

     

    • Anonymous's avatar
      Anonymous
      Not applicable

      That's fantastic. Thank you!

      I understand how the first approach works but I'm having trouble wrapping my mind around the second approach.

      Would you explain how it works?