Forum Discussion

Anonymous's avatar
Anonymous
Not applicable
4 years ago
Solved

Convert Text Duration to Type Duration

Hello. I am trying to convert a text field to a duration, but my data comes in like this:    I'd prefer to do this in Power Query Editor (M), rather than a calculated column (DAX). Can anyone...
  • Greg_Deckler's avatar
    4 years ago

    Anonymous Ah well, couple folks beat me to the fun. I personally like Jakinta's solution mainly because it doesn't use regex which is like, why is that still a thing? Honestly though, CNENFRNL it is pretty cool that you can use regex in Power Query it's just I thought regex went the way of Perl and that everyone was happy about that fact.

     

    Anyway, not to be outdone and left with a hacky DAX solution, I created one that is just as functional and flexible as the elegant solutions by Jakinta and CNENFRNL:

    Duration = 
        VAR __Separator = " "
        VAR __SearchText = MAX('Table'[Text Duration])
        VAR __Len = LEN(__SearchText)
        VAR __Count = __Len - LEN(SUBSTITUTE(__SearchText,__Separator,"")) + 1
        VAR __Table = 
            ADDCOLUMNS(
                ADDCOLUMNS(
                    GENERATESERIES(1,__Count,1),
                    "__Word",
                        VAR __Text = SUBSTITUTE(__SearchText,__Separator,"|",IF([Value]=1,1,[Value]-1))
                        VAR __Start =
                            SWITCH(TRUE(),
                                __Count = 1,1,
                                [Value] = 1,1,
                                FIND("|",__Text)+1
                            )
                        VAR __End = 
                            SWITCH(TRUE(),
                                __Count = 1,__Len,
                                [Value] = 1,FIND("|",__Text) - 1,
                                [Value] = __Count,__Len,
                                FIND(__Separator,__Text,__Start)-1
                            )
                        VAR __Word = MID(__Text,__Start,__End - __Start + 1)
                    RETURN __Word
                ),
                "__Key",
                    SWITCH(TRUE(),
                        SEARCH("day",[__Word],,0)>0,"day",
                        SEARCH("hour",[__Word],,0)>0,"hour",
                        SEARCH("minute",[__Word],,0)>0,"minute",
                        SEARCH("second",[__Word],,0)>0,"second",
                        BLANK()
                    )
            )
        VAR __Days = MAXX(FILTER(__Table,[Value] = MAXX(FILTER(__Table,[__Key]="day"),[Value]) - 1),[__Word])+0
        VAR __Hours = MAXX(FILTER(__Table,[Value] = MAXX(FILTER(__Table,[__Key]="hour"),[Value]) - 1),[__Word])+0
        VAR __Minutes = MAXX(FILTER(__Table,[Value] = MAXX(FILTER(__Table,[__Key]="minute"),[Value]) - 1),[__Word])+0
        VAR __Seconds = MAXX(FILTER(__Table,[Value] = MAXX(FILTER(__Table,[__Key]="second"),[Value]) - 1),[__Word])+0
    RETURN
        __Days * 1000000 + __Hours * 10000 + __Minutes * 100 + __Seconds

     

    Most of the code is just Text to Table, which I should have thought about to begin with. And posted to the gallery here: Text Duration Conversion - Microsoft Power BI Community