[英]Is there a simple way to convert a CSV with 0-indexed paths as keys to JSON with Miller?
考慮以下 CSV:
email/1,email/2
abc@xyz.org,bob@pass.com
您可以使用Miller輕松地將其轉換為 JSON(考慮到鍵定義的路徑):
mlr --icsv --ojson --jflatsep '/' cat file.csv
[ { "email": ["abc@xyz.org", "bob@pass.com"] } ]
現在,如果路徑在 CSV 中是 0 索引的(這肯定更常見):
email/0,email/1
abc@xyz.org,bob@pass.com
然后,在事先不了解字段名稱的情況下,您似乎必須重寫整個轉換:
編輯:將硬編碼/
替換為FLATSEP
內置變量:
mlr --icsv --flatsep '/' put -q '
begin { @labels = []; print "[" }
# translate the original CSV header from 0-indexed to 1-indexed
NR == 1 {
i = 1;
for (k in $*) {
@labels[i] = joinv( apply( splita(k,FLATSEP), func(e) {
return typeof(e) == "int" ? e+1 : e
}), FLATSEP );
i += 1;
}
}
NR > 1 { print @object, "," }
# create an object from the translated labels and the row values
o = {};
i = 1;
for (k,v in $*) {
o[@labels[i]] = v;
i += 1;
}
@object = arrayify( unflatten(o,FLATSEP) );
end { if (NR > 0) { print @object } print "]" }
' file.csv
我想知道我是否遺漏了一些明顯的東西,例如命令行選項或使用put
動詞重命名字段的方法,或者其他東西? 也歡迎您對以前的代碼提出您的見解,因為我對我的 Miller 的編程技能不太有信心。
更新:
使用@aborruso 預處理 CSV header 的方法,這可以簡化為:
注意:我沒有保留正則regextract
部分,因為這意味着提前知道 CSV header。
mlr --csv -N --flatsep '/' put '
NR == 1 {
for (i,k in $*) {
$[i] = joinv( apply( splita(k,FLATSEP), func(e) {
return typeof(e) == "int" ? e+1 : e
}), FLATSEP );
}
}
' file.csv |
mlr --icsv --flatsep '/' --ojson cat
即使有使用rename
動詞(當你提前知道 header 時)或預處理 CSV header 等變通方法,我仍然希望 Miller 的作者可以添加一個額外的命令行選項來處理這種0‑索引外部數據; 添加像arrayify0
(和flatten0
)這樣的DSL
function 在某些情況下也很有用。
我想知道我是否遺漏了一些明顯的東西,比如命令行選項或用 put 動詞重命名字段的方法,或者其他東西?
從此開始
email/0,email/1
abc@xyz.org,bob@pass.com
您可以使用隱式 CSV header 並運行
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
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.