0

次の入力を含むcsvがあります

Product1,Comp1|Comp2|Comp3|...,Owner1|Owner2|||...
Product2,Comp1|Comp2|Comp3|...,Owner1|||Owner3|...
Product3,CompX

| で区切られた Comp リストの変数番号を示すために .... を置きます。すべての Comp csv ファイルについて、利用可能な場合は所有者情報があり、そうでない場合は空白になると想定できます。

次の形式でxmlを生成する必要があります

<product='Product1' Comp='Comp1' Owner='Owner1' />
<product='Product1' Comp='Comp2' Owner='Owner2' />
<product='Product1' Comp='Comp3' Owner='' />
.
.
.

<product='Product2' Comp='Comp1' Owner='Owner1' />
<product='Product2' Comp='Comp2' Owner='' />
<product='Product2' Comp='Comp3' Owner='Owner3' />
.
.
.
<product='Product3' Comp='CompX' Owner='' />

私はそれのために次のコードを書きました。

ifs=$IFS
IFS='
'

for line in `cat input.csv`;do
# echo $line
prd=`echo $line | cut -d',' -f1`
components=`echo $line | cut -d',' -f2`
owners=`echo $line | cut -d',' -f3`

# echo $components

IFS='|'
i=0
for comp in `echo $components`;do
   i=`expr $i + 1`
   IFS=$ifs
   owner=`echo $owners | cut -d'|' -f$i`
   echo "<product='$prd' Comp='$comp' Owner='$owner' />"
done
done

これは正しく機能していません。誰かが私にそれを行う他の方法を提案できますか?

4

1 に答える 1

0

...表記についてはよくわかりません。単一のforループを使用してすべての内部列ロジックを処理し、単純なwhile readメソッドを使用して行ごとに処理します。

while read LINE
do
        COLUMNS=(`echo $LINE | tr ',' ' '`)
        COMPS=(`echo ${COLUMNS[1]} | tr '|' ' '`)
        for (( i=0 ; i<${#COMPS[@]} ; i++ ))
        do
                OWNER=`echo ${COLUMNS[2]} | awk '{split($0,owner,"|"); print owner[$1]}'
                echo "<product='${COLUMNS[0]}' Comp='${COMPS[$i]}' Owner='$OWNER' />"
        done
done < input.csv
于 2012-08-01T13:59:59.403 に答える