【问题标题】:Convert xml dictionary to csv with bash使用 bash 将 xml 字典转换为 csv
【发布时间】:2017-07-20 10:16:53
【问题描述】:

我有一个变量 $ENTRIES

ENTRIES="<entry key="key-one">value</entry> <entry key="key-two">value/two</entry>"

需要转换成csv:

convertToCSV() {
    # Do stuff with $ENTRIES
} >> dict.csv

导致:

cat dict.csv
key-one,value
key-two,value/two

我们如何从 $ENTRIES 中提取键和值? 会说我们需要某种 sed 命令吗? 我们在哪里取关键:

key=" and ">

并取以下之间的值:

> and </entry> 

并且以某种方式循环遍历 $ENTRIES 中的所有条目...

【问题讨论】:

    标签: xml bash csv data-conversion


    【解决方案1】:

    尝试关注一次,如果这对您有帮助,请告诉我。一旦您对结果感到满意,您就可以将此值重定向到 .csv 输出文件。

    解决方案一:

    echo "$ENTRIES" | awk -v RS=" " '{sub(/.*=/,"");sub(/<.*/,"");sub(/>/,",");if($0){print}}'
    

    第二个解决方案:在这里也增加一个解决方案。

    ENTRIES="<entry key=\"key-one\">value</entry> <entry key=\"key-two\">value/two</entry>"
    echo "$ENTRIES" | awk -v RS='<entry key=|</entry>' 'NF{sub(/>/,",");gsub(/\"/,"");print}'
    key-one,value
    key-two,value/two
    

    【讨论】:

    • 超级!但是它会导致带有引号的键:“key-one”,value“key-two”,value/two
    • 所以第二个是:echo "$ENTRIES" | awk -v RS='/,",");print}' 您能否编辑这两个解决方案,然后我可以接受它作为答案。 (:
    • 我已经在你的变量中转义了 " 让它成为变量的值,现在看看我的编辑,如果这对你有帮助,请告诉我。
    • 我在上一条评论中的提议已经删除了 csv 中的 ",转义 $ENTRIES 中的 " 对我来说不是一个解决方案。
    • 你是如何保存 $ENTRIES 变量的?因为要在 shell 中创建任何变量,您只需要提供变量名称,并且在打印时您需要提供 $variable_name。因此,当您将 variable_name="values...." 放入其中时,如果有任何 " 出现,您需要对其进行转义,以便只有我逃脱了它,请让我知道。
    【解决方案2】:

    另一种选择是将 XPath 与 xmlstarlet... 一起使用...

    ENTRIES='<entry key="key-one">value</entry> <entry key="key-two">value/two</entry>'
    
    echo "<doc>$ENTRIES</doc>" | \
        xmlstarlet sel -t \
        -m "/doc/entry" \
        -v "concat(@key,',',normalize-space())" \
        -n \
        > dict.csv
    

    注意事项:

    • 我需要用另一个元素 (doc) 包装 $ENTRIES 变量以使 XML 格式正确。
    • 我需要通过删除 $ 并将外部引号更改为撇号来更改 ENTRIES 变量。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2016-08-17
      • 2018-12-09
      • 2021-07-31
      • 1970-01-01
      相关资源
      最近更新 更多