【问题标题】:Xml file to CSV outputXML 文件到 CSV 输出
【发布时间】:2015-02-10 16:15:59
【问题描述】:

我有 xml 文件,格式如下,我想将其转换为 csv otput,如下所示。不幸的是,我不允许安装 xmlstarlet 或其他一些 xml 解析器(我只有 xmllint)。我该如何做到这一点,例如使用 awk、sed....

     <xn:VsDataContainer id="site00881">
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008811,ManagedElement=1</es:listOfNe>
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008819,ManagedElement=1</es:listOfNe>
                </xn:VsDataContainer>
                <xn:VsDataContainer id="site00882">
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008821,ManagedElement=1</es:listOfNe>

<es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008829,ManagedElement=1</es:listOfNe>
                </xn:VsDataContainer>
                <xn:VsDataContainer id="site00883">
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR13,MeContext=rbs008831,ManagedElement=1</es:listOfNe>
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=ASDTUR_SIU,MeContext=siu008832,ManagedElement=siu008832</es:listOfNe>
                </xn:VsDataContainer>
                <xn:VsDataContainer id="site00884">
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008841,ManagedElement=1</es:listOfNe>
                            <es:listOfNe>SubNetwork=NL1_R,SubNetwork=AHPTUR14,MeContext=rbs008849,ManagedElement=1</es:listOfNe>
                </xn:VsDataContainer>

输出应为 csv 格式

 rbs008811,site00881
 rbs008819,site00881
 rbs008821,site00882
 rbs008829,site00882
 rbs008831,site00883
 siu008832,site00883
 rbs008841,site00884
 rbs008849,site00884

【问题讨论】:

  • 我不确定你是否可以。尝试在没有 XML 解析器 is a great way to drive yourself insane 的情况下解析 XML。顺便说一句,为什么你“不允许安装”你正在做的工作所需的工具?

标签: xml bash csv export-to-csv


【解决方案1】:

我会为您提供xmllint 的帮助,但您的 xml 文件似乎无效。

无论如何,这是一个快速而肮脏的解决方案,您应该避免使用它:

grep -Po "(rbs|site)\d+" file.xml | awk '/site/{site=$1} /rbs/{print $1","site}' 
rbs008811,site00881
rbs008819,site00881
rbs008821,site00882
rbs008829,site00882
rbs008831,site00883
rbs008841,site00884
rbs008849,site00884

【讨论】:

  • 没关系,但我没有带有选项 -oP 的 grep,不幸的是它没有安装...支持的是 -hblcnsviw。
  • 好的,然后将 grep 命令替换为:perl -lne '/((rbs|site)\d+)/ &amp;&amp; print "$1"'
  • 是的,没关系,只需要在csv中。格式。可以如上转换吗?
  • 您需要通过管道将其传送到 awk 以获取 csv:perl -lne '/((rbs|site)\d+)/ &amp;&amp; print "$1"' file.xml | awk '/site/{site=$1} /rbs/{print $1","site}'
【解决方案2】:

通常对解析 XML 有所保留:

gawk -v OFS=, '
    match($0, /VsDataContainer id="([^"]+)/, m) {container = m[1]} 
    match($0, /MeContext=([^,]+)/, m)           {print m[1], container}
' file

如果您没有 GNU awk:

awk -v OFS=, '
    /VsDataContainer id="/ {
        sub(/.*id="/, "")
        sub(/".*/, "")
        container = $0
    } 
    /MeContext=/ {
        sub(/.*MeContext=/, "")
        sub(/,.*/, "")
        print $0, container
    }
' file

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-02-03
    • 2017-07-06
    相关资源
    最近更新 更多