如何使用gawk将csv转换为xml?

时间:2017-04-20 14:43:01

标签: mysql xml csv awk gawk

我想在Ubuntu 16.04上使用awk(gawk)创建一个可执行文件,将csv文件转换为xml文件。根据我的收集,所需格式如下。

$ cat tst.awk
BEGIN { FS="," }
NR==1 {
for (i=1; i<=NF; i++) {
    tags[i] = $i
}
next
}
{
print "<whatever>"
for (i=1; i<=NF; i++) {
    printf "    <%s>%s</%s>\n", tags[i], $i, tags[i]
}
print "</whatever>"
}

如何告诉awk插入每个字段并重复直到文件结尾?

输入

$ cat file.csv
id,color,status
7,black,open
52,white,closed

输出

awk -f tst.awk file.csv
<whatever>
    <id>7</id>
    <color>black</color>
    <status>open</status>
</whatever>
<whatever>
    <id>52</id>
    <color>white</color>
    <status>closed</status>
</whatever>

这会打印到屏幕但我需要它在输出文件中。如果某个字段为1,我还需要输入true,如果某个字段为0,我也需要输入。

需要输出示例

<?xml version="1.0" encoding="UTF-8"?>
<Batch>
  <ASWFileVersion>
  <BatchHeader>
    <BatchId>965</BatchId>
    <UserBatchId>965</UserBatchId>
  </BatchHeader>
  <BatchCustomer>
     <EmployeeNumber>123456</EmployeeNumber>
     <FirstName>fname</FirstName>
     <LastName>lname</LastName>
     <Employee>true </Employee>
  </BatchCustomer>
  <BatchCustomer>
     <EmployeeNumber>654321</EmployeeNumber>
     <FirstName>first</FirstName>
     <LastName>lastn</LastName>
     <Employee>false</Employee>
  </BatchCustomer>
</Batch>

文件没有标题,字段不按顺序显示在xml中。有一个布尔值为1或0的值必须转换为true或false。

1 个答案:

答案 0 :(得分:1)

你的问题中有太多的文字需要解决,但是一般来说如何使用awk将CSV转换为XML,因为这似乎是你问题的根源:

$ cat tst.awk
BEGIN { FS="," }
NR==1 {
    for (i=1; i<=NF; i++) {
        tags[i] = $i
    }
    next
}
{
    print "<whatever>"
    for (i=1; i<=NF; i++) {
        printf "    <%s>%s</%s>\n", tags[i], $i, tags[i]
    }
    print "</whatever>"
}

$ cat file.csv
id,color,status
7,black,open
52,white,closed

$ awk -f tst.awk file.csv
<whatever>
    <id>7</id>
    <color>black</color>
    <status>open</status>
</whatever>
<whatever>
    <id>52</id>
    <color>white</color>
    <status>closed</status>
</whatever>

希望有所帮助。如果没有,那么编辑你的问题,以包括简洁,可测试的样本输入和预期输出。