同じタグ名を持つ複数の子要素を含むXMLファイルがあります。<Name>Luigi</Name>
、、、<Name>Mario</Name>
。<Name>Peach</Name>
これは私の入力ファイルのモデルです。
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
分析のためにこのファイルをExcelに配置すると、Name
各要素の新しいレコードが作成されます。これは、読みやすさの点では優れていますが、名前フィールドの外に繰り返しデータがたくさんあるかどうかを確認するのは困難です。
私がやりたいことは、ラベルの名前をに変更することですName1
。Name2
これにより、Name3
ラベルをExcelにインポートすると、すべて同じ行に表示されます。これにより、元のデータを見続けることなく、私に役に立たない、または重複したエントリを含むレコードを見つけることができます。
つまり、次のような出力を生成するスクリプトやコマンドが必要です。
<!-- names.xml -->
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
これを使ってこれを行うことはできますか?sedコマンドや他のUnixスクリプト?
ベストアンサー1
あなたが具体的に要求したので、各要素が同じ行で開いて閉じる場合は、必要な操作を実行する/スクリプトは次のsed
ようになります。sed
bash
<Name>
(IFS='';
n=0;
while read line; do
if echo "${line}" | grep -Pq "<Name>\w+</Name>"; then
((n++));
echo "${line}" | sed "s/<Name>\(\w\+\)<\/Name>/<Name${n}>\1<\/Name${n}>/";
else
echo "${line}";
fi;
done) < names.xml
次の入力ファイルでテストしました。
<!-- names.xml -->
<Names>
<Name>Luigi</Name>
<Name>Mario</Name>
<Name>Peach</Name>
</Names>
次の出力が生成されました。
<Names>
<Name1>Luigi</Name1>
<Name2>Mario</Name2>
<Name3>Peach</Name3>
</Names>
つまり、XML構文解析ライブラリがある言語に適した候補のようです。目的のタスクを実行するPythonスクリプトは次のとおりです。
#!/usr/bin/env python2
# -*- encoding: ascii -*-
# add_suffix.py
import sys
import xml.etree.ElementTree
# Load the data
tree = xml.etree.ElementTree.parse(sys.argv[1])
root = tree.getroot()
# Update the XML tree
suffix = 0
for name in root.iter("Name"):
suffix += 1
name.tag += str(suffix)
# Write out the updated data
tree.write(sys.argv[2])
次のように実行します。
python add_suffix.py names.xml new_names.xml