如何使用 gawk 将 csv 转换为 xml?
How do I use gawk to convert csv to xml?
我想在 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,我还需要设置 false。
需要输出示例
<?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>
文件中没有 header,并且字段未按必须出现在 xml 中的顺序排列。有一个布尔值 1 或 0 必须转换为真或假。
您的问题中的文字太多,无法浏览,但一般来说,如何使用 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>
希望对您有所帮助。如果没有,请编辑您的问题以包括简明、可测试的样本输入和预期输出。
我想在 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,我还需要设置 false。
需要输出示例
<?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>
文件中没有 header,并且字段未按必须出现在 xml 中的顺序排列。有一个布尔值 1 或 0 必须转换为真或假。
您的问题中的文字太多,无法浏览,但一般来说,如何使用 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>
希望对您有所帮助。如果没有,请编辑您的问题以包括简明、可测试的样本输入和预期输出。