【问题标题】:csv to xml command line and conditioncsv 到 xml 命令行和条件
【发布时间】:2015-06-05 02:06:27
【问题描述】:

我正在尝试使用 awk 将 csv 转换为 xml 文件。为了更好地理解,我举了一个我的 csv 文件的例子:

name;num_tel;num_fixe;id_client;num_comd    
gwenael;0998452223;1038431234;50C;12345   
marcel;0966442312;1038453211;31C;654321     
judith;0954674487;1045227937;23D;78965
paul;0998452223;1038431234;35X;19945
toto;0966442312;1038453211;31Z;994991  
marie;0954674487;1045227937;23C;78944
jacque;0998452223;1038431234;77C;18845
trucmuche;0966442312;1038453211;31Z;666321  
tata;0954674487;1045227937;23D;77965

我的目标是取 id_client 的第三个字母 (C,D,X,Z),例如: xml 中的字母是 C,我将只有标签名称 num_comd 和 tel_fixe。 如果字母是 D 我将有标签名称,id_client,num_fixe

我成功地将带有命令剪切的 awk 脚本管道中的字母放入变量中 现在我在这里:

 if(var==C) 
  {}
Else if (var==D)
{}

你能帮我解决如何输入正确的xml标签的问题吗? 我对命令行很陌生。

很抱歉写作错误。我是法国人。

【问题讨论】:

    标签: xml csv awk


    【解决方案1】:

    这是一个可执行的 awk 脚本示例,我在其中创建了几个帮助函数来重用代码:

    #!/usr/bin/awk -f
    
    BEGIN {
        FS=";"
        documentEnclosingTag = "rows"
        c_flds["name"]; c_flds["num_comd"]; c_flds["num_tel"]
        d_flds["name"]; d_flds["id_client"]; d_flds["num_fixe"]
        x_flds["name"]
        z_flds["name"]
    
        print "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
        printf "<%s>\n", documentEnclosingTag
    }
    
    FNR==1 { gsub(" ", ""); for(i=1; i<=NF; i++) cols[$i]=i; next }
    
    $(cols["id_client"]) ~ /C$/ { print createObject( "C", c_flds ) }
    $(cols["id_client"]) ~ /D$/ { print createObject( "D", d_flds ) }
    $(cols["id_client"]) ~ /X$/ { print createObject( "X", x_flds ) }
    $(cols["id_client"]) ~ /Z$/ { print createObject( "Z", z_flds ) }
    
    END { printf "</%s>\n", documentEnclosingTag }
    
    #----------- functions -----------
    
    function createObject( enclosingTag, flds,          key, s) {
        for(key in flds) {
            s = s "\t" wrapData( key, $(cols[key]) ) "\n"
        }
        return( wrapData( enclosingTag, "\n" s ) )
    }
    
    function wrapData( enclosingTag, data ) {
        return( sprintf( "<%s>%s</%s>", enclosingTag, data, enclosingTag ) )
    }
    

    你可以把它放在一个文件中(script.awk),让它可执行,然后像这样运行它

    ./script.awk data > data.xml
    

    data 是我为您的数据文件命名的名称,data.xml 是数据最终存放的位置。

    输出如下:

    <?xml version="1.0" encoding="UTF-8"?>
    <rows>
    <C>
            <num_tel>0998452223</num_tel>
            <name>gwenael</name>
            <num_comd>12345   </num_comd>
    </C>
    <C>
            <num_tel>0966442312</num_tel>
            <name>marcel</name>
            <num_comd>654321     </num_comd>
    </C>
    <D>
            <id_client>23D</id_client>
            <num_fixe>1045227937</num_fixe>
            <name>judith</name>
    </D>
    <X>
            <name>paul</name>
    </X>
    <Z>
            <name>toto</name>
    </Z>
    <C>
            <num_tel>0954674487</num_tel>
            <name>marie</name>
            <num_comd>78944</num_comd>
    </C>
    <C>
            <num_tel>0998452223</num_tel>
            <name>jacque</name>
            <num_comd>18845</num_comd>
    </C>
    <Z>
            <name>trucmuche</name>
    </Z>
    <D>
            <id_client>23D</id_client>
            <num_fixe>1045227937</num_fixe>
            <name>tata</name>
    </D>
    </rows>
    

    我确定我没有为 XML 文件的各个部分使用正确的术语,但此输出可以由浏览器作为“有效”(可解析)XML 加载。如果应该将此文件提供给其他任何人,您可能需要查看 DTD。

    以下是一般分类:

    • BEGIN 块中,将字段分隔符设置为;,初始化每个“对象”和documentEnclosingTag 所需的输出字段等变量,然后打印通用XML 标头以及documentEnclosingTag
    • FNR==1 块中,将第一行数据作为标题并将它们放入cols 数组中,以便稍后可以通过其标题名称引用flds。使用gsub 调用清理数据以修剪列名
    • 对于每个 $(cols["id_client"]) 块,通过指定一个 enclosureTag 值和匹配的所需 flds 数组,打印一个适当的“对象”。
    • END,打印结束documentEnclosingTag

    功能方面:

    • wrapData 在数据周围创建一个带有封闭标签的字符串。
    • createObject 使用 wrapData 为“对象”本身创建元素和封闭标签,其中我使用 awk 的标准字符串连接添加了一些输出格式。 flds 数组表示所需的输出字段。 keys 是函数的局部变量。每个fld、数据和标签都连接到s,最后senclosingTag包裹,并作为字符串返回。

    【讨论】:

    • 非常感谢您的教程让我非常感兴趣,我正在努力适应我的代码,当然我会回来回答问题。
    • 我回来问你如何查信,以id_client的C为例。例如,我们有 50C0145 而不是 50C。我该怎么做 ?谢谢
    • 分解$(cols["id_client"]) ~ /C$/就像说“匹配第四个fld的值与C在字段末尾的正则表达式匹配的记录”。从/C$/ 中删除$ 将满足您的要求:$(cols["id_client"]) ~ /C/。检查每个部分:$(cols["id_client"]) => $(4) => $4, ~ => "匹配者", /C$/ => C 的正则表达式在 @ 之前的字段末尾987654359@.
    • 你好,我有一个这样的问题,stackoverflow.com/questions/29456382/…。你能再帮我一次吗?
    【解决方案2】:

    这是一个使用您提供的示例数据读取名为 in 的文件的示例。

    awk -F\; '$4~/C/ {print "<name>"$1"</name>"} $4~/D/{print "<name>"$1"</name><id_client>"$4"</id_client>"}' < in
    

    您应该能够填写扩展此示例所需的额外 xml 元素。

    这个命令的输出是: <name>gwenael</name> <name>marcel</name> <name>judith</name><id_client>23D</id_client> <name>marie</name> <name>jacque</name> <name>tata</name><id_client>23D</id_client>

    【讨论】:

      猜你喜欢
      • 2017-09-16
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2016-05-23
      • 1970-01-01
      • 2014-08-29
      • 1970-01-01
      相关资源
      最近更新 更多