awk将csv转换为xml和wellform

时间:2015-04-08 16:35:37

标签: xml csv awk

还有一个问题,我需要改变循环

name;num_tel;num_fixe;id_client;num_comd;email;city;date_liv
gwenael;0998452223;1038431234;50C;12345;gwa@yahoo.fr;London;08/07/2015
marcel;0966442312;1038453211;31C;654321;marcel@yahoo.fr;Pairs;08/06/2015
judith;0954674487;1045227937;23D;78965;judith@yahoo.fr;Toulouse;11/05/2015
paul;0998452223;1038431234;35X;19945;paul@yahoo.fr;Bordeaux;01/04/2015
toto;0966442312;1038453211;31Z;994991;toto@yahoo.frNice;02/12/2015 
marie;0954674487;1045227937;23C;78944;marie@yahoo.fr;Lille;04/08/2015
jacque;0998452223;1038431234;77C;18845;jacque@yahoo.fr;Bruges;09/05/2015
trucmuche;0966442312;1038453211;31Z;666321;trucmuche@yahoo.fr;Berlin;10/04/2015 
tata;0954674487;1045227937;23D;77965;tata@yahoo.fr;New-york;08/07/2015

我必须修改awk脚本实际上使用一个循环来做不害羞 我需要的。 1)我需要将循环更改为if条件,因为在我必须执行的操作中 在脚本中添加标记名称,以便从csv中标记标记名称。

例如在脚本中我将拥有哪些不是 在csv到框架中  在csv中以xml输出。

2)用户可以在生成之前使用默认标签名称在csv中添加标签。 例如,让我们考虑用户添加标签city和date_liv 所以他们在csv的默认标签之后取得了位置(第7列和第8列)。 那么如何用从第7列开始到xml结尾的循环添加它们呢?

3)是否可以重命名标签?例如,命令为num_comd。

 <rows>
 <C = id_client>
    <client> 
                <identity>              
                            <name>  

                                <M>
                                        <num> </num>
                                        <num_tel> </num_tel>
                                        <num_comd> </num_comd>
                                </M>                                    
                </identity>

            <locomotion>car</locomotion>
</client>
</C>
</rows>

1 个答案:

答案 0 :(得分:1)

让我们开始编写一个脚本来完成我认为我理解你想要的东西然后你可以告诉我们它需要做什么不同/另外:

$ cat tst.awk                             
BEGIN { FS=";"; print "<rows>\n" }

NR==1 { for (i=1; i<=NF; i++) f[$i]=i; next }

{ tag = $(f["id_client"]); gsub(/[0-9]/,"",tag) }

tag == "C" { type="client"; flds="num_tel num_comd" }
tag == "D" { type="pro"; flds="id_client num_fixe" }

{
    split("name "flds,n,/ /)
    printf     "<%s: %s>\n", tag, $(f["id_client"])
    printf     "    <%s>\n", type
    print      "        <identity>"
    for (i=1;i in n;i++)
        printf "            <%s>%s</%s>\n", n[i], $(f[n[i]]), n[i]
    print      "        </identity>"
    printf     "        <locomotion>%s</locomotion>\n", locomotion
    printf     "    </%s>\n", type
    printf     "</%s>\n\n", tag
}

END { print "</rows>" }

$ awk -v locomotion='car' -f tst.awk file
<rows>

<C: 50C>
    <client>
        <identity>
            <name>gwenael</name>
            <num_tel>0998452223</num_tel>
            <num_comd>12345</num_comd>
        </identity>
        <locomotion>car</locomotion>
    </client>
</C>

<C: 31C>
    <client>
        <identity>
            <name>marcel</name>
            <num_tel>0966442312</num_tel>
            <num_comd>654321</num_comd>
        </identity>
        <locomotion>car</locomotion>
    </client>
</C>

<D: 23D>
    <pro>
        <identity>
            <name>judith</name>
            <id_client>23D</id_client>
            <num_fixe>1045227937</num_fixe>
        </identity>
        <locomotion>car</locomotion>
    </pro>
</D>

</rows>

现在 - 它还需要做什么?