gpt4 book ai didi

xml - 如何使用 awk 解析逗号分隔值 (csv)?

转载 作者:数据小太阳 更新时间:2023-10-29 02:23:10 43 4
gpt4 key购买 nike

我正在尝试编写一个 awk 脚本来将 CSV 格式的电子表格转换为 XML,以解决 Bugzilla 错误。输入 CSV 的格式如下(从 XLS 电子表格创建并保存为 CSV):

tag_1,tag_2,...,tag_N
value1_1,value1_2,...,value1_N
value2_1,value2_2,...,value2_N
valueM_1,valueM_2,...,valueM_N

标题列表示 XML 标记的名称。转换为 XML 的上述文件应如下所示:

<element>
<tag_1>value1_1</tag_1>
<tag_2>value1_2</tag_2>
...
<tag_N>value1_N</tag_N>
</element>
<element>
<tag_1>value2_1</tag_1>
<tag_2>value2_2</tag_2>
...
<tag_N>value2_N</tag_N>
</element>
...

我必须完成的 awk 脚本如下:

BEGIN {OFS = "\n"}
NR == 1 {for (i = 1; i <=NF; i++)
tag[i]=$i
print "<bugzilla version=\"3.4.1\" urlbase=\"http://mozilla.com/\" maintainer=\"somebody@mozilla.com\" exporter=\"somebody.else@mozilla.com\">"}
NR != 1 {print " <bug>"
for (i = 1; i <= NF; i++)
print " <" tag[i] ">" $i "</" tag[i] ">"
print " </bug>"}
END {print "</bugzilla>"}

实际的 CSV 文件是:

cf_foo,cf_bar,short_desc,cf_zebra,cf_pizza,cf_dumpling ,assigned_to,bug_status,cf_word,cf_caslte
ABCD,A-BAR-0032,A NICE DESCRIPTION - help me,pretty,Pepperoni,,,NEW,,

实际输出为:

$ awk -f csvtobugs.awk bugs.csv

<bugzilla version="3.4.1" urlbase="http://mozilla.com/" maintainer="somebody@mozilla.com" exporter="somebody.else@mozilla.com">
<bug>
<cf_foo,cf_bar,short_desc,cf_zebra,cf_pizza,cf_dumpling>ABCD,A-BAR-0032,A</cf_foo,cf_bar,short_desc,cf_zebra,cf_pizza,cf_dumpling>
<,assigned_to,bug_status,cf_word,cf_caslte>NICE</,assigned_to,bug_status,cf_word,cf_caslte>
<>DESCRIPTION</>
<>-</>
<>help</>
<>me,pretty,Pepperoni,,,NEW,,</>
</bug>
<bug>
</bug>
</bugzilla>

显然,这不是预期的结果(我承认,我从这个论坛复制粘贴了这个脚本:http://www.unix.com/shell-programming-scripting/21404-csv-xml.html)。问题是我已经很久没看过 awk 脚本了,我不知道语法的含义。

最佳答案

您需要在 BEGIN 规则中设置 FS = "," 以使用逗号作为字段分隔符;如果字段分隔符是制表符,那么您显示的代码应该可以工作,这是文件中的一种不同(也很流行)约定,即使不使用逗号,这些文件通常仍称为“CSV”;-)。

关于xml - 如何使用 awk 解析逗号分隔值 (csv)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1445706/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com