accessing data from json array of json arrays
"'Nick Anderson' via help-cfengine" <[email protected]> Tue, 13 Jun 2023 09:43:21 -0500
| Newsgroups | gmane.comp.sysutils.cfengine.general |
|---|---|
| Message-ID | <[email protected]> |
Hi, Chris
Hi,
i am reading in a inventory file in csv format with
readdcsv() and get what i believe is a array of arrays.
R: From aix inventory, got data
[["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"],
["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"],
["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"],
["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]]
Yep, that's what it looks like to me.
By the way, have you seen `classfiltercsv()'? One of it's nice
features is named columns.
now i need to extract the version number from a package
(by name). tried filter() and grep() but both returned
nothing.
example:
["xlfrte.aix61","15.1.3.5","default","lslpp"]
package name version
so how to do it?
What is it you want to do with the version number?
I often like to use associative arrays for to re-construct data
structures.
I might access it like this:
,----
| bundle agent __main__
| {
| methods: "eval_numbers";
| }
| bundle agent eval_numbers {
|
| vars:
|
| #"my_data" data => readcsv("$(sys.workdir)/state/software_packages.csv");
| "my_data" data => '[["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"],
| ["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"],
| ["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"],
| ["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]]';
|
| # here we get the positional indices of each array which we use to iterate over the data
| "l_indices_my_data" slist => getindices( my_data );
|
| # We might build an associative array which can make the data easier to
| # work with. You may or may not want to use all the fields. You can even
| # do filtering here if you only need to use part of the data, e.g. by
| # adding if => regcmp( "^xlfrte.*$", "$(my_data[$(l_indices_my_data)][0])" )
|
| "arr_my_data[$(my_data[$(l_indices_my_data)][0])][version]"
| string =>"$(my_data[$(l_indices_my_data)][1])";
| "arr_my_data[$(my_data[$(l_indices_my_data)][0])][field3]" # Perhaps useless
| string =>"$(my_data[$(l_indices_my_data)][2])";
| "arr_my_data[$(my_data[$(l_indices_my_data)][0])][command]" # Perhaps useless
| string =>"$(my_data[$(l_indices_my_data)][3])";
|
|
| # From here you can get a consolidated list of package names, which could be filtered
| "l_my_data_packages" slist => getindices( arr_my_data );
| "l_my_data_filtered" slist => filter( "^xlfrte.*$",
| getindices( arr_my_data ), # Could have used l_my_data_packages instead of getindices again
| true,
| false,
| inf);
| reports:
|
| # Print out a list of the filtered package names
| "Filtered result: $(with)" with => join( ", ", l_my_data_filtered );
|
| # Print out a list of the filtered package names and their versions
| "Package $(l_my_data_filtered): $(arr_my_data[$(l_my_data_filtered)][version])";
| }
`----
,----
| # cf-agent --no-lock --log-level info --show-evaluated-vars=eval_numbers --file /tmp/example.cf
| R: Filtered result: xlfrte, xlfrte.aix61
| R: Package xlfrte: 15.1.3.5
| R: Package xlfrte.aix61: 15.1.3.5
| Variable name Variable value Meta tags Comment
| default:eval_numbers.arr_my_data[xlfrte.aix61][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlfrte.aix61][field3] default source=promise
| default:eval_numbers.arr_my_data[xlfrte.aix61][version] 15.1.3.5 source=promise
| default:eval_numbers.arr_my_data[xlfrte][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlfrte][field3] default source=promise
| default:eval_numbers.arr_my_data[xlfrte][version] 15.1.3.5 source=promise
| default:eval_numbers.arr_my_data[xlmass.10.1.0][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlmass.10.1.0][field3] default source=promise
| default:eval_numbers.arr_my_data[xlmass.10.1.0][version] 10.1.0.0 source=promise
| default:eval_numbers.arr_my_data[xlmass.8.1.3][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlmass.8.1.3][field3] default source=promise
| default:eval_numbers.arr_my_data[xlmass.8.1.3][version] 8.1.3.1 source=promise
| default:eval_numbers.arr_my_data[xlmass.adt.include][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlmass.adt.include][field3] default source=promise
| default:eval_numbers.arr_my_data[xlmass.adt.include][version] 6.1.0.4 source=promise
| default:eval_numbers.arr_my_data[xlmass.aix53.lib][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlmass.aix53.lib][field3] default source=promise
| default:eval_numbers.arr_my_data[xlmass.aix53.lib][version] 6.1.0.4 source=promise
| default:eval_numbers.arr_my_data[xlmass.lib][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlmass.lib][field3] default source=promise
| default:eval_numbers.arr_my_data[xlmass.lib][version] 6.1.0.4 source=promise
| default:eval_numbers.arr_my_data[xlsmp.aix61.rte][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlsmp.aix61.rte][field3] default source=promise
| default:eval_numbers.arr_my_data[xlsmp.aix61.rte][version] 5.1.0.0 source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][field3] default source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.EN_US.rte][version] 5.1.0.0 source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][field3] default source=promise
| default:eval_numbers.arr_my_data[xlsmp.msg.en_US.rte][version] 5.1.0.0 source=promise
| default:eval_numbers.arr_my_data[xlsmp.rte][command] lslpp source=promise
| default:eval_numbers.arr_my_data[xlsmp.rte][field3] default source=promise
| default:eval_numbers.arr_my_data[xlsmp.rte][version] 5.1.0.0 source=promise
| default:eval_numbers.l_indices_my_data {"0","1","2","3","4","5","6","7","8","9","10"} source=promise
| default:eval_numbers.l_my_data_filtered {"xlfrte","xlfrte.aix61"} source=promise
| default:eval_numbers.l_my_data_packages {"xlfrte","xlmass.adt.include","xlmass.8.1.3","xlfrte.aix61","xlmass.10.1.0","xlsmp.aix61.rte","xlmass.lib","xlmass.aix53.lib","xlsmp.rte","xlsmp.msg.EN_US.rte","xlsmp.msg.en_US.rte"} source=promise
| default:eval_numbers.my_data [["xlsmp.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.en_US.rte","5.1.0.0","default","lslpp"],["xlsmp.msg.EN_US.rte","5.1.0.0","default","lslpp"],["xlsmp.aix61.rte","5.1.0.0","default","lslpp"],["xlmass.lib","6.1.0.4","default","lslpp"],["xlmass.aix53.lib","6.1.0.4","default","lslpp"],["xlmass.adt.include","6.1.0.4","default","lslpp"],["xlmass.8.1.3","8.1.3.1","default","lslpp"],["xlmass.10.1.0","10.1.0.0","default","lslpp"],["xlfrte.aix61","15.1.3.5","default","lslpp"],["xlfrte","15.1.3.5","default","lslpp"]] source=promise
`----
--
You received this message because you are subscribed to the Google Groups "help-cfengine" group.
To unsubscribe from this group and stop receiving emails from it, send an email to [email protected].
To view this discussion on the web visit https://groups.google.com/d/msgid/help-cfengine/87a5x3whh2.fsf%40northern.tech.