Есть ли простой способ преобразовать CSV с 0-индексированными путями в качестве ключей в JSON с Миллером?

Рассмотрим следующий CSV:

      email/1,email/2
abc@xyz.org,bob@pass.com

Вы можете легко преобразовать его в JSON (с учетом путей, определенных ключами) с помощью Miller:

      mlr --icsv --ojson --jflatsep / cat file.csv
      [ { "email": ["abc@xyz.org", "bob@pass.com"] } ]

Теперь, если пути имеют нулевой индекс в CSV (что, безусловно, более распространено):

      email/0,email/1
abc@xyz.org,bob@pass.com

Затем, без предварительного знания имен полей, кажется, что вам придется переписать все преобразование:

      mlr --icsv put -q '
    begin { @paths = []; @output = []; @prev; print "[" }

    # convert the CSV header from 0-indexed to 1-indexed paths
    NR == 1 {
        i = 1;
        for (k in $*) {
            @paths[i] = joinv(apply(splita(k,"/"), func(e) { return typeof(e) == "int" ? e+1 : e }) , "/");
            i += 1;
        }
    }

    NR > 1 { print @prev, "," }

    # create an object corresponding to the paths
    o = {};
    i = 1;
    for (k,v in $*) {
        o[@paths[i]] = v;
        i += 1;
    }
    @prev = arrayify(unflatten(o,"/"));

    end { if (NR >= 1) { print @prev } print "]" }
' file.csv

Я хотел бы знать, не упускаю ли я что-то очевидное, например параметр командной строки или способ переименовать поля с помощью putглагол или что-то другое? Вы также можете поделиться своим мнением о предыдущем коде, так как я не очень уверен в своих навыках программирования Миллера.

1 ответ

Я хотел бы знать, не упускаю ли я что-то очевидное, например параметр командной строки или способ переименовать поля с помощью глагола put, или, может быть, что-то еще?

Начиная с этого

      email/0,email/1
abc@xyz.org,bob@pass.com

вы можете использовать неявный заголовок CSV и запустить

      mlr --csv -N put 'if (NR == 1) {for (k in $*) {$[k] = "email/".string(int(regextract($[k],"[0-9]+"))+1)}}' input.csv

иметь

      email/1,email/2
abc@xyz.org,bob@pass.com
Другие вопросы по тегам