簡體   English   中英

有沒有一種簡單的方法可以使用 Miller 將具有 0 索引路徑作為鍵的 CSV 轉換為 JSON?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM