【问题标题】:Awk convert csv to xml optionnal tag and rename tag [closed]awk 将 csv 转换为 xml 可选标签并重命名标签 [关闭]
【发布时间】:2015-06-17 01:39:50
【问题描述】:
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
judith;0954674487;1045227937;23D;78965;judith@yahoo.fr;Toulouse;11/05/2015

从这个 csv 我使用 awk 命令在输出中生成这个 xml。 我需要帮助解决 2 个问题。 标签名称 (name;num_tel;num_fixe;id_client;num_comd;email;) 是 csv 的默认值 和 city;date_liv 已由用户在生成 csv 之前添加,他们可以在默认标签之后添加更多标签。 我的目标是在我的 xml 中输出所有可选标签,一旦它们被输入到 csv 我尝试使用循环,但我有很多错误我需要帮助才能做到这一点。 我从位置 7 开始,因为可选标签从那个位置开始直到结束。

NF==1 for (i=7;i<=NF;i++)
    { 
        printf " <option>%s</option>\n"
            printf " <val>%s</val>\n"
    }

其次,如何在我的 awk 脚本中将例如 num_tel 的标签重命名为手机?

<rows>
 <C>
    <client> 
                <identity>              
                            <name> gwenael </name>

                                <M>
                                        <num_fixe> 0998452223 </num_fixe>
                                        <contact>
                                                <cell phone>1038431234 </cell phone>   <!--num_tel--!>
                                        </contact>  

                                        <option>city</option>       
                                        <value>London </value>
                                        <option>date_liv</option>
                                        <value>08/07/2015</value>

                                        <num_comd> 12345</num_comd>
                                </M>                                    
                </identity>
                                        <date_liv>08/07/2015</date_liv>
            <locomotion>car</locomotion>
</client>
</C>

<D>
    <pro> 
                <identity>              
                            <name> judith </name>

                                <id_client>23D</id_client>

                                <option>city</option>       
                                <value>Paris </value>
                                <option>date_liv</option>
                                <value>08/05/2015</value>

                                        <num_fixe> 0998452223 </num_fixe>
                            <company>
                                <num_fixe>1045227937</num_fixe>
                            </company>  
                                        <num_comd> 12345</num_comd>                                   
                </identity>
                                        <date_liv>08/07/2015</date_liv>
            <locomotion>car</locomotion>
    </pro>
</D>

【问题讨论】:

  • 您的输出中有一些无法解释的部分。例如,我们如何从输入中得到&lt;C: id_client =50C&gt;?这应该是C 标签吗?你有一个结束&lt;/C&gt; 所以我想它应该是。两个不同行的 XML 具有完全不同的结构。请edit 整理您的问题并提供清晰、一致的所需输出。
  • 对不起,我没有明确指出 C 和 D 组是基于 id_client 字符串。实际上 在 xml 中显示为 。并且在组 C 中的标记名称输出与组 D 中的不同。但不用担心,我已经在我的 awk 脚本中处理了这一点。主要问题是关于可选标签和更改标签名称。如果您有任何问题,请我在这里谢谢您
  • &lt;C=50C&gt; 是无效的 XML!如果它与您的问题无关,也许您还是应该删除它并专注于您想要的部分。
  • 好的,我删除了它,但有时我有答案,我们告诉我“提供更多细节”,这样我做了什么,但它与我的问题无关,它只是为了展示什么的结构我在做
  • 我真的学到了我一步一步收到的所有答案。当您说我没有清楚地解释我的问题时,您是对的,对此我深表歉意。这是因为用户一点一点地向我提供信息,所以我无法清楚地解释它。我可以告诉你我是如何根据你给我的东西制作我的剧本的,我知道你对此很生气,我真的很抱歉。 awk 和我所知道的真的不一样

标签: xml csv awk


【解决方案1】:

专注于将自定义字段添加到输出中的问题,您可以使用类似的东西。您需要将这些部分插入脚本的适当位置:

# set field separator
BEGIN { FS=";" }

# first line
NR == 1 {
    for (i=7; i<=NF; ++i) a[i] = $i # store field headers in array a
    next                            # skip to next line
}

# all other lines
{
    # print values along with the matching name from the array
    for (i=7; i<=NF; ++i) printf "<option>%s</option><value>%s</value>", a[i], $i
}

您想要的输出格式不清楚,所以我没有在代码中使用任何格式字符,但是您可以使用内置的 ORS 在循环中的每个 &lt;option&gt;-&lt;value&gt; 对之后添加一个换行符(输出记录分隔符)变量:

printf "<option>%s</option><value>%s</value>%s", a[i], $i, ORS

使用ORS 而不是\n 的优势在于它与平台无关,这意味着代码应该适用于在Windows 中使用DOS 行结尾或在其他系统上使用UNIX 行结尾的文件。

【讨论】:

    猜你喜欢
    • 2012-12-11
    • 2018-04-03
    • 2012-09-10
    • 2015-08-08
    • 2014-07-09
    • 2021-11-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-01
    相关资源
    最近更新 更多