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.