使用bash将xml字典转换为csv

时间:2017-07-20 10:16:54

标签: xml bash csv data-conversion

我有一个var $ 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中的所有条目......

2 个答案:

答案 0 :(得分:1)

尝试一次,让我知道这是否对您有所帮助。一旦你对结果感到满意,你就可以将这个值重新定向到.csv输出文件。

解决方案1:

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

答案 1 :(得分:0)

另一种选择是将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

注意:

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