我写了一个表达式来解析我的xml到CSV但它不起作用,请帮我吧。我是这样做的,因为我不能在服务器上使用像xmlstarlet这样的解析器。
这是我的xml
<?xml version="1.0"?>
<root>
<record>
<country>US</country>
<data>
<id_client>50C</id_client>
<mail>1@mail.com</mail>
<adress>10 </adress>
<num_tel>001</num_tel>
<name>toto</name>
<birth>01/30/008</birth>
</data>
<data>
<id_client>100K</id_client>
<mail>2@mail.com</mail>
<adress>10 </adress>
<num_tel>002</num_tel>
<name>toto2</name>
<birth>01/30/011</birth>
</data>
</ record>
<record>
<country>China</country>
<data>
<id_client>99E</id_client>
<mail>3@mail.com</mail>
<adress>10 </adress>
<num_tel>003</num_tel>
<name>toto3</name>
<birth>01/30/0008</birth>
</data>
<data>
<id_client>77B</id_client>
<mail>4@mail.com</mail>
<adress>10 </adress>
<num_tel>004</num_tel>
<name>toto4</name>
<birth>2001/05/01</birth>
</data>
</record
</root>
我需要的输出:
country;id_client;name
US;50C;toto1
US;100K;toto2
China;99E;toto3
China77B;toto4
最终我的语法是我试图更新:
/<country>/{sub(".*<country[^>]+><[^>]+>","",$0);sub("<.*","",$0);s=s";"$0}/<\/country>/{sub("^;","",s);print s;s=""}
答案 0 :(得分:3)
如果您的数据总是按照您显示的每个行显示一个条目而没有干净的空白区域:
$ cat tst.awk
BEGIN {
FS="[><]"; OFS=";"
n = split("country id_client name",tags,/ /)
for (i=1; i<=n; i++) {
printf "%s%s", tags[i], (i<n?OFS:ORS)
}
}
{ tag2val[$2] = $3 }
/<\/data>/ {
for (i=1; i<=n; i++) {
printf "%s%s", tag2val[tags[i]], (i<n?OFS:ORS)
}
}
$ awk -f tst.awk file
country;id_client;name
US;50C;toto
US;100K;toto2
China;99E;toto3
China;77B;toto4
如果您将来关注不同或其他标签,只需将它们添加到split()
命令的列表中。