Hello,
I have data like below.
{"property":"XYZ", "period":{ "start":"2022-09-16", "end":"2022-10-02" }, "nb-day":17, "nb-rate-plans":518, "nb-products":16, "total":{ "avail":48, "price":0 }, "filtered":{ "avail":0, "price":0 }, "rate-plans":{ "IWU35":{ "avail":16, "price":0 }, "IWU30":{ "avail":16, "price":0 }, "IWU40":{ "avail":16, "price":0 } }, "check-ins":{ "0":{ "avail":3, "price":0 }, "1":{ "avail":3, "price":0 }, "2":{ "avail":3, "price":0 }, "3":{ "avail":3, "price":0 }, "4":{ "avail":3, "price":0 }, "5":{ "avail":3, "price":0 }, "6":{ "avail":3, "price":0 }, "7":{ "avail":3, "price":0 }, "8":{ "avail":3, "price":0 }, "9":{ "avail":3, "price":0 }, "10":{ "avail":3, "price":0 }, "11":{ "avail":3, "price":0 }, "12":{ "avail":3, "price":0 }, "13":{ "avail":3, "price":0 }, "14":{ "avail":3, "price":0 }, "15":{ "avail":3, "price":0 } } }
{ "property":"ABC", "period":{ "start":"2022-09-16", "end":"2022-10-02" }, "nb-day":17, "nb-rate-plans":518, "nb-products":16, "total":{ "avail":48, "price":0 }, "filtered":{ "avail":0, "price":0 }, "rate-plans":{ "IWU35":{ "avail":16, "price":0 }, "IWU30":{ "avail":16, "price":0 }, "IWU40":{ "avail":16, "price":0 } }, "check-ins":{ "0":{ "avail":3, "price":0 }, "1":{ "avail":3, "price":0 }, "2":{ "avail":3, "price":0 }, "3":{ "avail":3, "price":0 }, "4":{ "avail":3, "price":0 }, "5":{ "avail":3, "price":0 }, "6":{ "avail":3, "price":0 }, "7":{ "avail":3, "price":0 }, "8":{ "avail":3, "price":0 }, "9":{ "avail":3, "price":0 }, "10":{ "avail":3, "price":0 }, "11":{ "avail":3, "price":0 }, "12":{ "avail":3, "price":0 }, "13":{ "avail":3, "price":0 }, "14":{ "avail":3, "price":0 }, "15":{ "avail":3, "price":0 } } }
1. Need to calculate date based on below example->
start : 2022-09-16
"check-ins":{ "0":{ "avail":3, "price":0 }, "1":{ "avail":3, "price":0 }, "2":{ "avail":3, "price":0 }, "3":{ "avail":3, "price":0 }, "4":{ "avail":3, "price":0 }, "5":{ "avail":3, "price":0 }, "6":{ "avail":3, "price":0 }, "7":{ "avail":3, "price":0 }, "8":{ "avail":3, "price":0 }, "9":{ "avail":3, "price":0 }, "10":{ "avail":3, "price":0 }, "11":{ "avail":3, "price":0 }, "12":{ "avail":3, "price":0 }, "13":{ "avail":3, "price":0 }, "14":{ "avail":3, "price":0 }, "15":{ "avail":3, "price":0 } }
Index from check-ins need to be added in start-date
Date: desync
2022-09-16 + 0 = 2022-09-16 avail+price(3+0)
2022-09-16 + 1 =2022-09-17
2022-09-16 + 2= 2022-09-18
2022-09-16 + 15 = 2022-10-01
I need to convert check-ins index into date and then calculate desync for each day
Thanks in advance!!
I assume that the JSON data is already extracted into "property", "period.start", "check-ins.0.avail", "check-ins.15.price", etc. If not, use spath to do so.
| eval period_start = strptime('period.start', "%F"), period_end = strptime('period.end', "%F")
| eval days_in_period = round((period_end - period_start) / 86400)
| foreach check-ins.*.avail
[eval desync = mvappend(desync, 'period.start' . " + " . <<MATCHSTR>> . ":avail+price(" . '<<FIELD>>' . "+" . 'check-ins.<<MATCHSTR>>.price' . ")")]
| mvexpand desync
| eval desync = split(desync, ":")
| eval Date = mvindex(desync, 0), desync = mvindex(desync, 1)
| table property Date desync
This will give you
property | Date | desync |
XYZ | 2022-09-16 + 0 | avail+price(3+0) |
XYZ | 2022-09-16 + 1 | avail+price(3+0) |
XYZ | 2022-09-16 + 10 | avail+price(3+0) |
XYZ | 2022-09-16 + 11 | avail+price(3+0) |
XYZ | 2022-09-16 + 12 | avail+price(3+0) |
XYZ | 2022-09-16 + 13 | avail+price(3+0) |
XYZ | 2022-09-16 + 14 | avail+price(3+0) |
XYZ | 2022-09-16 + 15 | avail+price(3+0) |
XYZ | 2022-09-16 + 2 | avail+price(3+0) |
XYZ | 2022-09-16 + 3 | avail+price(3+0) |
XYZ | 2022-09-16 + 4 | avail+price(3+0) |
XYZ | 2022-09-16 + 5 | avail+price(3+0) |
XYZ | 2022-09-16 + 6 | avail+price(3+0) |
XYZ | 2022-09-16 + 7 | avail+price(3+0) |
XYZ | 2022-09-16 + 8 | avail+price(3+0) |
XYZ | 2022-09-16 + 9 | avail+price(3+0) |
ABC | 2022-09-16 + 0 | avail+price(3+0) |
ABC | 2022-09-16 + 1 | avail+price(3+0) |
ABC | 2022-09-16 + 10 | avail+price(3+0) |
ABC | 2022-09-16 + 11 | avail+price(3+0) |
ABC | 2022-09-16 + 12 | avail+price(3+0) |
ABC | 2022-09-16 + 13 | avail+price(3+0) |
ABC | 2022-09-16 + 14 | avail+price(3+0) |
ABC | 2022-09-16 + 15 | avail+price(3+0) |
ABC | 2022-09-16 + 2 | avail+price(3+0) |
ABC | 2022-09-16 + 3 | avail+price(3+0) |
ABC | 2022-09-16 + 4 | avail+price(3+0) |
ABC | 2022-09-16 + 5 | avail+price(3+0) |
ABC | 2022-09-16 + 6 | avail+price(3+0) |
ABC | 2022-09-16 + 7 | avail+price(3+0) |
ABC | 2022-09-16 + 8 | avail+price(3+0) |
ABC | 2022-09-16 + 9 | avail+price(3+0) |
Hey @yuanliu
Thanks for the quick response.
But I think there is some miscommunication about the expected result.
Could you please help me with actual result after calculation. The calculation part (avai+price) not needed to display in result. just the final answer. Total value of after adding avail and price value should come with corresponding date
property | Date | desync |
XYZ | 2022-09-16 | 3 |
I thought I was missing something from the description as it didn't feel natural😃. Calculating values is simpler than tripping over those strings, actually.
| eval period_start = strptime('period.start', "%F"), period_end = strptime('period.end', "%F")
| eval days_in_period = round((period_end - period_start) / 86400)
| foreach check-ins.*.avail
[eval desync = mvappend(desync, period_start + <<MATCHSTR>> * 86400 . ":" . '<<FIELD>>' + 'check-ins.<<MATCHSTR>>.price')]
| eval desync = mvsort(desync)
| mvexpand desync
| eval desync = split(desync, ":")
| eval Date = strftime(mvindex(desync, 0), "%F"), desync = mvindex(desync, 1)
| table property Date desync
Output would be
property | Date | desync |
XYZ | 2022-09-16 | 30 |
XYZ | 2022-09-17 | 30 |
XYZ | 2022-09-18 | 30 |
XYZ | 2022-09-19 | 30 |
XYZ | 2022-09-20 | 30 |
XYZ | 2022-09-21 | 30 |
XYZ | 2022-09-22 | 30 |
XYZ | 2022-09-23 | 30 |
XYZ | 2022-09-24 | 30 |
XYZ | 2022-09-25 | 30 |
XYZ | 2022-09-26 | 30 |
XYZ | 2022-09-27 | 30 |
XYZ | 2022-09-28 | 30 |
XYZ | 2022-09-29 | 30 |
XYZ | 2022-09-30 | 30 |
XYZ | 2022-10-01 | 30 |
ABC | 2022-09-16 | 30 |
ABC | 2022-09-17 | 30 |
ABC | 2022-09-18 | 30 |
ABC | 2022-09-19 | 30 |
ABC | 2022-09-20 | 30 |
ABC | 2022-09-21 | 30 |
ABC | 2022-09-22 | 30 |
ABC | 2022-09-23 | 30 |
ABC | 2022-09-24 | 30 |
ABC | 2022-09-25 | 30 |
ABC | 2022-09-26 | 30 |
ABC | 2022-09-27 | 30 |
ABC | 2022-09-28 | 30 |
ABC | 2022-09-29 | 30 |
ABC | 2022-09-30 | 30 |
ABC | 2022-10-01 | 30 |
(Now that bowesmana helped me figure out https://community.splunk.com/t5/Splunk-Search/Why-did-Splunk-9-0-1-quot-Fail-to-parse-templatized-se... I am working on a semantically clearer code. But this should work.)
Hello @yuanliu
I am getting error Field 'desync' does not exist in the data, using above query.
I think desync used in mvappend function is not in my data.
[eval desync = mvappend(desync, period_start + <<MATCHSTR>> * 86400 . ":" . '<<FIELD>>' + 'check-ins.<<MATCHSTR>>.price')]
@Sanjana In Splunk, any undefined variable is initialized as null(). So, desync starts with value null(), then with each <<FIELD>> iteration, mvappend adds a non-null value to the array. You can test this with
| makeresults
| eval f = mvappend(null(), "a", "b")
Resultant f should contain two values, ("a", "b").
Here is my full test code with simulated data as you illustrated:
| makeresults
| eval data=mvappend("{\"property\":\"XYZ\", \"period\":{ \"start\":\"2022-09-16\", \"end\":\"2022-10-02\" }, \"nb-day\":17, \"nb-rate-plans\":518, \"nb-products\":16, \"total\":{ \"avail\":48, \"price\":0 }, \"filtered\":{ \"avail\":0, \"price\":0 }, \"rate-plans\":{ \"IWU35\":{ \"avail\":16, \"price\":0 }, \"IWU30\":{ \"avail\":16, \"price\":0 }, \"IWU40\":{ \"avail\":16, \"price\":0 } }, \"check-ins\":{ \"0\":{ \"avail\":3, \"price\":0 }, \"1\":{ \"avail\":3, \"price\":0 }, \"2\":{ \"avail\":3, \"price\":0 }, \"3\":{ \"avail\":3, \"price\":0 }, \"4\":{ \"avail\":3, \"price\":0 }, \"5\":{ \"avail\":3, \"price\":0 }, \"6\":{ \"avail\":3, \"price\":0 }, \"7\":{ \"avail\":3, \"price\":0 }, \"8\":{ \"avail\":3, \"price\":0 }, \"9\":{ \"avail\":3, \"price\":0 }, \"10\":{ \"avail\":3, \"price\":0 }, \"11\":{ \"avail\":3, \"price\":0 }, \"12\":{ \"avail\":3, \"price\":0 }, \"13\":{ \"avail\":3, \"price\":0 }, \"14\":{ \"avail\":3, \"price\":0 }, \"15\":{ \"avail\":3, \"price\":0 } } }",
"{ \"property\":\"ABC\", \"period\":{ \"start\":\"2022-09-16\", \"end\":\"2022-10-02\" }, \"nb-day\":17, \"nb-rate-plans\":518, \"nb-products\":16, \"total\":{ \"avail\":48, \"price\":0 }, \"filtered\":{ \"avail\":0, \"price\":0 }, \"rate-plans\":{ \"IWU35\":{ \"avail\":16, \"price\":0 }, \"IWU30\":{ \"avail\":16, \"price\":0 }, \"IWU40\":{ \"avail\":16, \"price\":0 } }, \"check-ins\":{ \"0\":{ \"avail\":3, \"price\":0 }, \"1\":{ \"avail\":3, \"price\":0 }, \"2\":{ \"avail\":3, \"price\":0 }, \"3\":{ \"avail\":3, \"price\":0 }, \"4\":{ \"avail\":3, \"price\":0 }, \"5\":{ \"avail\":3, \"price\":0 }, \"6\":{ \"avail\":3, \"price\":0 }, \"7\":{ \"avail\":3, \"price\":0 }, \"8\":{ \"avail\":3, \"price\":0 }, \"9\":{ \"avail\":3, \"price\":0 }, \"10\":{ \"avail\":3, \"price\":0 }, \"11\":{ \"avail\":3, \"price\":0 }, \"12\":{ \"avail\":3, \"price\":0 }, \"13\":{ \"avail\":3, \"price\":0 }, \"14\":{ \"avail\":3, \"price\":0 }, \"15\":{ \"avail\":3, \"price\":0 } } }")
| mvexpand data
| spath input=data
| eval period_start = strptime('period.start', "%F"), period_end = strptime('period.end', "%F")
| eval days_in_period = round((period_end - period_start) / 86400)
| foreach check-ins.*.avail
[eval desync = mvappend(desync, period_start + <<MATCHSTR>> * 86400 . ":" . '<<FIELD>>' + 'check-ins.<<MATCHSTR>>.price')]
| mvexpand desync
| eval desync = split(desync, ":")
| eval Date = strftime(mvindex(desync, 0), "%F"), desync = mvindex(desync, 1)
| table property Date desync
Hey @yuanliu
Yes correct.
With sample data output is coming as expected. But when I am using on my actual data then error comes as desync does not exist.
Not sure why................
I examined your updates in the other thread. It seems that your actual data may include some outer keys that envelopes the JSON object posted above, such as "event" and "kIndexKey_EventMessage". Is this correct? Each envelope requires an additional path.
Suppose your actual data structure is like
{"event": {"kIndexKey_EventMessage": {<the posted JSON}}
your code needs to provide the full paths. If you do not, the foreach command will produce no output, therefore you get the Field 'desync' does not exist error in mvexpand command.
One method to resolve path is as proposed by kamlesh, use path=event.kIndexKey_EventMessage in spath. If your raw data is already parsed, however, you can also simply reference full path in the filters, e.g.,
| eval period_start = strptime('content.kIndexKey_EventMessage.period.start', "%F"), period_end = strptime('content.kIndexKey_EventMessage.period.end', "%F")
| foreach content.kIndexKey_EventMessage.check-ins.*.avail
[eval desync = mvappend(desync, period_start + <<MATCHSTR>> * 86400 . ":" . '<<FIELD>>' + 'content.kIndexKey_EventMessage.check-ins.<<MATCHSTR>>.price')]
| eval desync = mvsort(desync)
| mvexpand desync
| eval desync = split(desync, ":")
| eval Date = strftime(mvindex(desync, 0), "%F"), desync = mvindex(desync, 1)
| table content.kIndexKey_EventMessage.property Date desync
content.kIndexKey_EventMessage.property | Date | desync |
XYZ | 2022-09-16 | 30 |
XYZ | 2022-09-17 | 30 |
XYZ | 2022-09-18 | 30 |
XYZ | 2022-09-19 | 30 |
XYZ | 2022-09-20 | 30 |
XYZ | 2022-09-21 | 30 |
XYZ | 2022-09-22 | 30 |
XYZ | 2022-09-23 | 30 |
XYZ | 2022-09-24 | 30 |
XYZ | 2022-09-25 | 30 |
XYZ | 2022-09-26 | 30 |
XYZ | 2022-09-27 | 30 |
XYZ | 2022-09-28 | 30 |
XYZ | 2022-09-29 | 30 |
XYZ | 2022-09-30 | 30 |
XYZ | 2022-10-01 | 30 |
ABC | 2022-09-16 | 30 |
ABC | 2022-09-17 | 30 |
ABC | 2022-09-18 | 30 |
ABC | 2022-09-19 | 30 |
ABC | 2022-09-20 | 30 |
ABC | 2022-09-21 | 30 |
ABC | 2022-09-22 | 30 |
ABC | 2022-09-23 | 30 |
ABC | 2022-09-24 | 30 |
ABC | 2022-09-25 | 30 |
ABC | 2022-09-26 | 30 |
ABC | 2022-09-27 | 30 |
ABC | 2022-09-28 | 30 |
ABC | 2022-09-29 | 30 |
ABC | 2022-09-30 | 30 |
ABC | 2022-10-01 | 30 |
Here is my data simulation
makeresults
| eval data=mvappend("{\"content\":
{\"kIndexKey_EventMessage\":
{\"property\":\"XYZ\", \"period\":{ \"start\":\"2022-09-16\", \"end\":\"2022-10-02\" }, \"nb-day\":17, \"nb-rate-plans\":518, \"nb-products\":16, \"total\":{ \"avail\":48, \"price\":0 }, \"filtered\":{ \"avail\":0, \"price\":0 }, \"rate-plans\":{ \"IWU35\":{ \"avail\":16, \"price\":0 }, \"IWU30\":{ \"avail\":16, \"price\":0 }, \"IWU40\":{ \"avail\":16, \"price\":0 } }, \"check-ins\":{ \"0\":{ \"avail\":3, \"price\":0 }, \"1\":{ \"avail\":3, \"price\":0 }, \"2\":{ \"avail\":3, \"price\":0 }, \"3\":{ \"avail\":3, \"price\":0 }, \"4\":{ \"avail\":3, \"price\":0 }, \"5\":{ \"avail\":3, \"price\":0 }, \"6\":{ \"avail\":3, \"price\":0 }, \"7\":{ \"avail\":3, \"price\":0 }, \"8\":{ \"avail\":3, \"price\":0 }, \"9\":{ \"avail\":3, \"price\":0 }, \"10\":{ \"avail\":3, \"price\":0 }, \"11\":{ \"avail\":3, \"price\":0 }, \"12\":{ \"avail\":3, \"price\":0 }, \"13\":{ \"avail\":3, \"price\":0 }, \"14\":{ \"avail\":3, \"price\":0 }, \"15\":{ \"avail\":3, \"price\":0 } } }
}}",
"{\"content\":
{\"kIndexKey_EventMessage\":
{ \"property\":\"ABC\", \"period\":{ \"start\":\"2022-09-16\", \"end\":\"2022-10-02\" }, \"nb-day\":17, \"nb-rate-plans\":518, \"nb-products\":16, \"total\":{ \"avail\":48, \"price\":0 }, \"filtered\":{ \"avail\":0, \"price\":0 }, \"rate-plans\":{ \"IWU35\":{ \"avail\":16, \"price\":0 }, \"IWU30\":{ \"avail\":16, \"price\":0 }, \"IWU40\":{ \"avail\":16, \"price\":0 } }, \"check-ins\":{ \"0\":{ \"avail\":3, \"price\":0 }, \"1\":{ \"avail\":3, \"price\":0 }, \"2\":{ \"avail\":3, \"price\":0 }, \"3\":{ \"avail\":3, \"price\":0 }, \"4\":{ \"avail\":3, \"price\":0 }, \"5\":{ \"avail\":3, \"price\":0 }, \"6\":{ \"avail\":3, \"price\":0 }, \"7\":{ \"avail\":3, \"price\":0 }, \"8\":{ \"avail\":3, \"price\":0 }, \"9\":{ \"avail\":3, \"price\":0 }, \"10\":{ \"avail\":3, \"price\":0 }, \"11\":{ \"avail\":3, \"price\":0 }, \"12\":{ \"avail\":3, \"price\":0 }, \"13\":{ \"avail\":3, \"price\":0 }, \"14\":{ \"avail\":3, \"price\":0 }, \"15\":{ \"avail\":3, \"price\":0 } } }
}}")
| mvexpand data
| rename data AS _raw
_raw |
{"content": {"kIndexKey_EventMessage": {"property":"XYZ", "period":{ "start":"2022-09-16", "end":"2022-10-02" }, "nb-day":17, "nb-rate-plans":518, "nb-products":16, "total":{ "avail":48, "price":0 }, "filtered":{ "avail":0, "price":0 }, "rate-plans":{ "IWU35":{ "avail":16, "price":0 }, "IWU30":{ "avail":16, "price":0 }, "IWU40":{ "avail":16, "price":0 } }, "check-ins":{ "0":{ "avail":3, "price":0 }, "1":{ "avail":3, "price":0 }, "2":{ "avail":3, "price":0 }, "3":{ "avail":3, "price":0 }, "4":{ "avail":3, "price":0 }, "5":{ "avail":3, "price":0 }, "6":{ "avail":3, "price":0 }, "7":{ "avail":3, "price":0 }, "8":{ "avail":3, "price":0 }, "9":{ "avail":3, "price":0 }, "10":{ "avail":3, "price":0 }, "11":{ "avail":3, "price":0 }, "12":{ "avail":3, "price":0 }, "13":{ "avail":3, "price":0 }, "14":{ "avail":3, "price":0 }, "15":{ "avail":3, "price":0 } } } }} |
{"content": {"kIndexKey_EventMessage": { "property":"ABC", "period":{ "start":"2022-09-16", "end":"2022-10-02" }, "nb-day":17, "nb-rate-plans":518, "nb-products":16, "total":{ "avail":48, "price":0 }, "filtered":{ "avail":0, "price":0 }, "rate-plans":{ "IWU35":{ "avail":16, "price":0 }, "IWU30":{ "avail":16, "price":0 }, "IWU40":{ "avail":16, "price":0 } }, "check-ins":{ "0":{ "avail":3, "price":0 }, "1":{ "avail":3, "price":0 }, "2":{ "avail":3, "price":0 }, "3":{ "avail":3, "price":0 }, "4":{ "avail":3, "price":0 }, "5":{ "avail":3, "price":0 }, "6":{ "avail":3, "price":0 }, "7":{ "avail":3, "price":0 }, "8":{ "avail":3, "price":0 }, "9":{ "avail":3, "price":0 }, "10":{ "avail":3, "price":0 }, "11":{ "avail":3, "price":0 }, "12":{ "avail":3, "price":0 }, "13":{ "avail":3, "price":0 }, "14":{ "avail":3, "price":0 }, "15":{ "avail":3, "price":0 } } } }} |
The key point here is: Code must match the actual path to data.