如何使用shell脚本从CSV逐行读取所有行并相应地创建多个XML文件(一行一个文件)

如何使用shell脚本从CSV逐行读取所有行并相应地创建多个XML文件(一行一个文件)

我正在尝试编写一个 shell 脚本,.xml根据从中读取的数据创建多个文件.csv。我需要有关如何为每个.xml文件创建循环的帮助。

此脚本的粗略算法

  • 在脚本中设置输入和输出文件
  • 创建任何函数或do whilefor读取每一行.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

相关内容