1

私はこのスプレッドシートを持っています。そこからいくつかの xml マニフェストを生成したいと思います。

スプレッドシートの一部を次に示します。

ここに画像の説明を入力

「mst-5.3_tmp.xml」という名前の xml が生成されます (セクションに基づくファイル名)。

<?xml version="1.0" encoding="iso-8859-1"?>

<activity type='cxp:jsp'>
<handler>mindtap_mastery</handler>

<!-- Section 5.3 Mastery -->
<group threshold="1" name="Energy and Temperature Change to Specific Heat">
 <items>
  <item src="owms01h/gen.question.32027" title="Mastery Item 1"/>
 </items>
</group>
<group threshold="3" name="Specific Heat to Energy or Temperature">
 <items>
  <item src="owms01h/gen.question.32040" title="Mastery Item 1"/>
  <item src="owms01h/gen.question.32041" title="Mastery Item 2"/>
  <item src="owms01h/gen.question.32046" title="Mastery Item 3"/>
  <item src="owms01h/gen.question.32048" title="Mastery Item 4"/>
 </items>
</group>
<group threshold="2" name="Thermal Equilibrium">
 <items>
  <item src="owms01h/gen.question.32378" title="Mastery Item 1"/>
  <item src="owms01h/gen.question.32380" title="Mastery Item 2"/>
 </items>
</group>
<group threshold="2" name="Phase Change Energetics">
 <items>
  <item src="owms01h/gen.question.3737" title="Mastery Item 1"/>
  <item src="owms01h/gen.question.3741" title="Mastery Item 2"/>
  <item src="owms01h/gen.question.3752" title="Mastery Item 3"/>
  <item src="owms01h/gen.question.3753" title="Mastery Item 4"/>
 </items>
</group>
<group threshold="2" name="Heating Curves - Calculations">
 <items>
  <item src="owms01h/gen.question.5640" title="Mastery Item 1"/>
  <item src="owms01h/gen.question.5641" title="Mastery Item 2"/>
  <item src="owms01h/gen.question.5642" title="Mastery Item 1"/>
  <item src="owms01h/gen.question.5643" title="Mastery Item 2"/>
 </items>
</group>

</activity>

私の目的は、スプレッドシートをタブ区切りのテキスト ファイルにエクスポートし、AWK を使用して xml を作成することです。「セクション」列に値が存在する場合、新しいファイルを作成する必要があります。隣接する「命令ユニット」列には、最初の「グループ」要素の名前が含まれています。このグループの「項目」は、隣接する「ガイザー項目名」列のエントリから始まります。次の行に「セクション」または「命令」がない場合Unit" 値の場合、現在のグループに項目として追加する必要があります。"Instructional Unit" 値はあるが "Section" がない場合は、新しいグループを作成する必要があります。

新しいファイルを開始および終了する方法と、上記のコントロールで説明されているように AWK が列/行をスキップする方法がわかりません。

これまでのところ、私が持っているのは、上で説明したものに近いが正確ではないネスティングを持つファイルを 1 つだけ作成するスクリプトだけです。

 #!/bin/bash

awk -F "\t" '{
    if ($2) {
    print "</items>";
    print "</group>";
    print "</activity>";
    print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>"
    print "<activity type='cxp:jsp'>";
    print "<handler>mindtap_mastery</handler>";
    print "<!--" $2 "-->";
    }
    if ($3) {
    print "<group threshold=\"1\" name=\"" $3 "\">";
    print "<items>";
    print "<item src=\"owms01h/" $4  "\" title=\"Mastery Item 1\"/>";
    } else {
    print "<item src=\"owms01h/" $4  "\" title=\"Mastery Item 1\"/>";
    }

}' 'Media Grid_Units 1-5.txt' >> master.xml
4

1 に答える 1

1

これを名前を付けて保存してsomefile.awk呼び出すことができますawk -F"\t" -f somefile.awk spreadsheet.tab

NR==1 || !$4 {next} # Skip the header and blank lines

$2 { # New section
    if (printingitems) { # close tags
        print "</items>" >> filename;
        print "</group>" >> filename;
        print "</activity>" >> filename;
    }
    # Build new filename
    split($2, part, " ");
    filename = "mst-"part[2]"_tmp.xml";

    print "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>" >> filename;
    print "<activity type='cxp:jsp'>" >> filename;
    print "<handler>mindtap_mastery</handler>" >> filename;
    print "<!--" $2 "-->" >> filename;
    printingitems = 0;
}

$3 { # New group
    if (printingitems) {
    print "</items>" >> filename;
    print "</group>" >> filename; 
    }
    groupname = substr($3, 5, length($3));
    print "<group threshold=\"1\" name=\"" groupname "\">" >> filename;
    print "<items>" >> filename;
    printingitems = 1;
} 

{ # new item
    print "<item src=\"owms01h/" $4  "\" title=\"Mastery Item "printingitems++"\"/>" >> filename;
}

END { # this assumes all non-blank lines will have an item
    print "</items>" >> filename;
    print "</group>" >> filename;
    print "</activity>" >> filename;
}
于 2013-05-14T05:12:47.863 に答える