我正在尝试编写一个 shell 脚本,.xml
根据从中读取的数据创建多个文件.csv
。我需要有关如何为每个.xml
文件创建循环的帮助。
此脚本的粗略算法
- 在脚本中设置输入和输出文件
- 创建任何函数或
do while
或for
读取每一行.csv
- 在任何单独的文件夹中创建一个
.xml
名为 emp-gid 的文件
样本Employee.csv
23456,USD
89012,EUR
12345,CHF
34567,SGD
示例.xml
结构
<?xml version="1.0" encoding="UTF-8"?>
<fi:Organisation>
<fi:Company>
<fi:DEPARTMENT>Account</fi:DEPARTMENT>
<fi:department-key>ABC123</fi:department-key>
<fi:department-id>121</fi:department-id>
</fi:Company>
<fi:Employee>
<fi:emp-gid>DE0008475021</fi:emp-gid>
<fi:country>EUR</fi:country>
</fi:body>
</fi:organisation>
我的 shell 脚本
#!/bin/bash
InputFile="Employee.csv"
OutputFile="Emp_gid.xml"
echo '<?xml version="1.0"?>' > $OutputFile
echo '<fi:organisation>' >> $OutputFile
echo '<fi:Company>' >> $OutputFile
echo '<fi:DEPARTMENT>Account</fi:DEPARTMENT>' >> $OutputFile
echo '<fi:department-key>ABC123</fi:department-key>' >> $OutputFile <-- want to increment by one for all xml file (ABC123,ABC124..) -->
echo '<fi:department-id>121</fi:department-id>' >> $OutputFile <-- want to increment by one for all xml file (121,122,123,..) -->
echo '</fi:Company>' >> $OutputFile
while IFS=$',' read -r -a arry
do
echo ' <fi:Employee>' >> $OutputFile
echo ' <fi:emp-gid>'${arry[0]}'</fi:emp-gid>' >> $OutputFile
echo ' <fi:country>'${arry[1]}'</fi:country>' >> $OutputFile
echo ' </fi:Employee>' >> $OutputFile
done < $InputFile
echo '</fi:organisation>' >> $OutputFile
上面的脚本仅生成一个.xml
包含所有记录的文件。但我希望有某个函数或脚本可以.xml
为文件中的每一行生成单独的文件.csv
并将其放入单独的文件夹中。
答案1
我会这样做:
# a printf format string
xml_template=$(cat <<'XML'
<?xml version="1.0" encoding="UTF-8"?>
<fi:Organisation>
<fi:Company>
<fi:DEPARTMENT>Account</fi:DEPARTMENT>
<fi:department-key>%s%d</fi:department-key>
<fi:department-id>%d</fi:department-id>
</fi:Company>
<fi:Employee>
<fi:emp-gid>%s</fi:emp-gid>
<fi:country>%s</fi:country>
</fi:body>
</fi:organisation>
XML
)
dept_key_prefix=ABC
dept_key=100 # choose suitable initial values
dept_id=100
while IFS=, read -r emp_gid country; do
printf "$xml_template" \
$dept_key_prefix \
$((dept_key++)) \
$((dept_id++)) \
"$emp_gid" \
"$country" \
> "$emp_gid.xml"
done < Employee.csv