CSVファイルの情報に基づいてSVGファイルを変更する

CSVファイルの情報に基づいてSVGファイルを変更する

色を追加したいアメリカ地図のSVGファイルがあります。時間がかかるので、bashスクリプトが使えると思いました。ステータスとそのステータスに属する色を含む他のファイルがあります。

SVGファイル:

<g id="hi">
    <title>Hawaii</title>
    <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
</g>

CSVファイル

HI, blue

私が望むもの:

<g id="hi" style="fill:blue;">
        <title>Hawaii</title>
        <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
    </g>

greporを使うことができると思いましたが、sedどこから始めるべきかわかりません。

答え1

bashとGNU sedの使用:

while IFS=",$IFS" read id color
do
    sed -i "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg
done <file.csv

完了すると、file.svgは次のようになります。

<g id="hi" style="fill:blue;">
    <title>Hawaii</title>
    <path class="state hi" d="m 233.08751,519.30948 ... z" id="HI" />
</g>

どのように動作しますか?

  • while IFS=",$IFS" read id color; do

    while変数sumを読み込んでidループを開始しますcolorIFS入力がコンマとスペースで区切られるようにコンマを追加します。

  • sed -i "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg

    これにより、file.svgの内部更新が行われます。idbash:を使用して小文字に変換されます${id,,}。その文字g id="${id,,}"列を見つけますg id="${id,,} style="fill:$color;"

    注:$id$colorsed コマンドに直接置き換えられます。あなたはこれをしなければなりません。〜しない限りfile.csv ファイルのソースを信頼します。

  • done <file.csv

    これでwhileループが終了し、ループから読み取るように指示しますfile.csv

BSD(OSX)

BSDシステムを使用している場合は、sedコマンドを少し変更する必要があります。

while IFS=",$IFS" read id color
do
    sed -i "" "s/g id=\"${id,,}\"/& style=\"fill:$color;\"/g" file.svg
done <file.csv

答え2

Perlとそのツールを使うxsh :

perl {
    open my $FH, '<', 'states.csv' or die $!;
    $h->{lc $1} = "$2;" while <$FH> =~ /(.*),\s*(.*)/;
};

open map.xml ;
for //g set @style concat("fill:", xsh:lookup('h', @id));
save :b ;

答え3

sed を 2 回使用します。

</tmp/states.csv tr "[A-Z]" "[a-z]" | \
sed -n 's/^\([a-z]\{2\}\), \([^ ]*\)$/s@<g id="\1">@<g id="\1" style="fill:\2;">@/p' >/tmp/script.sed
sed -f /tmp/script.sed /tmp/source.svg

1行目はsedスクリプト(/tmp/script.sed)を生成し、2行目はこれを実装します。ステータスリストが/tmp/states.csvに保存され、svgファイルが/tmp/source.svgに保存されているとします。

答え4

tr   \[:upper:] \[:lower:] <csv.file | sort -bt, -uk1,1   |
sed  -e'\|^ *\([[:alpha:]]\{2\}\) *, *\([[:alpha:]]\{1,\}\) *$|!d' \
     -e's||s/\\(<g id="\1"\\)>/\\1 style="fill:\2;">/;t|' |
sed  -f- svg.file

関連情報