Есть ли простой способ преобразовать 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