Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Inconsistent result when using $* #1519

Closed
TobyBrull opened this issue Mar 4, 2024 · 2 comments
Closed

Inconsistent result when using $* #1519

TobyBrull opened this issue Mar 4, 2024 · 2 comments

Comments

@TobyBrull
Copy link

I would have expected the following two commands to give the same results:

$ mlr -c --from <( echo $'a,b\n5,6' ) put '$array = $*' then put '${array.a} *= 1000'
a,b,array.a,array.b
5,6,1000,6

$ mlr -c --from <( echo $'a,b\n5,6' ) put '$array = $*' | mlr -c put '${array.a} *= 1000'
a,b,array.a,array.b
5,6,5000,6
@johnkerl
Copy link
Owner

johnkerl commented Jun 8, 2024

Hi @TobyBrull and sorry for the long delay!!

The put and filter DSL recognizes the . and sees that array.a is the a slot of array. But all the other verbs do not. :( So there is no field named "array.a".

This is addressed in #1062 (which needs doing).

This is super-weird -- I know. Having Miller accept input and output, in multiple formats, some of which allow nesting (JSON, JSON lines) and some of which don't (CSV, TSV), and trying to do the right thing by default for all combinations, is an exercise in compromise at best.

What's going on here:

  • In your first example:
  • In your second example:
    • The first mlr, before the pipe, flattens down to CSV as output, so the map-valued field arrays with keys a and b becomes two fields array.a and array.b (use --no-auto-flatten to suppress this)
    • The second mlr, after the pipe, has CSV input and output and no map-valued field names constructed mid-flight so the field names are array.a and array.b

See also
https://miller.readthedocs.io/en/latest/new-in-miller-6/#improved-json-json-lines-support-and-arrays

As a workaround, you can do the following -- this flattens the map-valued field array with keys a and b to two fields array.a and array.b:

$ mlr -c --from <( echo $'a,b\n5,6' ) put '$array = $*' then flatten then put '${array.a} *= 1000'
a,b,array.a,array.b
5,6,5000,6

@TobyBrull
Copy link
Author

Makes sense! Thanks for the detailed response!

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

2 participants