(fhana「星屑のインターリュード」)
アニメ『天体のメソッド』(2014)のEDなんですが、良い曲だなあと思ってずっと聞いてます。
肝心なアニメの方はまだ見ていないのですが、宇宙が関わっていれば、私はそれだけで満足です。
ヒッパルコス星表の見方を学習するため、sqlite3で操作しながらデータを理解していくことにしました。ってことで、sqlite3のデータベースにヒッパルコス星表をインポートしたいと思います。
インポートといってもコマンド一つです。
.import ファイル テーブル名
まずは、サンプルを作って実験してみます。
~$ cat <<EOL > sample_table > ID|FIELD1|FIELD2 > 1|data1|data12 > 2|data2|data22 > 3|data3|data33 > EOL ~$ cat sample_table ID|FIELD1|FIELD2 1|data1|data12 2|data2|data22 3|data3|data33
ヘッダ+3レコード作りました。このsample_tableファイルをsampledbというデータベースファイルを作って、インポートします。
~$ sqlite3 sampledb SQLite version 3.8.2 2013-12-06 14:53:30 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .import sample_table table1 sqlite> select * from table1; 1|data1|data12 2|data2|data22 3|data3|data33 sqlite> ~$
上手くできました。
では、ヒッパルコス星表でやってみましょう。データのwgetから。扱いやすいようにstarという短いファイル名にしました。
~$ wget http://heasarc.gsfc.nasa.gov/FTP/heasarc/dbase/dump/heasarc_hipparcos.tdat.gz ~$ gunzip heasarc_hipparcos.tdat.gz ~$ mv heasarc_hipparcos.tdat star
中を見ると、フィールドセパレータとして’|’を使っているようです。’|’を指定して各行のフィールド数をチェックします。uniqを使ってデータ全体の傾向を掴みましょう。
~$ awk -F\| '{print NF}' star | uniq -c 125 1 118218 81 1 1 ~$
ヘッダ部分が125行あり、本体が81フィールドのレコードが118218件あります。最後の行にフッタがあるようです。
フィールド名を調べます。適当な行(50~55)をサンプルしました。
~$ sed -n 50,55p star | cut -b-40 field[quality_fit] = float8:5.2f [stat. field[bt_mag] = float8:6.3f_mag [phot.ma field[bt_mag_error] = float8:5.3f_mag [s field[vt_mag] = float8:6.3f_mag [phot.ma field[vt_mag_error] = float8:5.3f_mag [s field[bt_mag_ref_dbl] = char1 [meta.cod ~$
フィールド名は、”field[フィールド名]” で表現されているようです。
なんらかの書式に従い構成されているように見えます。本来は書式を理解して正しく扱うべきですが、そのうちわかると思いますので、今回は扱いやすい書式にしてインポートしていきます。フィールド名を抽出して横に並べてみます。
~$ (perl -ne 'if(/field.(\w+)\]/){print "$1|"}' star;echo) > header
作成したヘッダのフィールド数を確認してみましょう。
~$ awk -F\| '{print NF}' header 81 ~$
81ということで、レコードのフィールド数と一致していますね。
次はレコード部分の抽出です。 126行目から末尾の1行前まででしたので、sedで抽出します。
~$ sed -n '$d;126,$p' star > body ~$
headerとbodyをくっつけます。もちろんcatです。
~$ cat header body > all
sqlite3でallをインポートしましょう。
~$ sqlite3 stardb SQLite version 3.8.2 2013-12-06 14:53:30 Enter ".help" for instructions Enter SQL statements terminated with a ";" sqlite> .import all hipparcos sqlite>
では、テーブルが入っているかselectで確認してみます。
sqlite> select name,ra,dec from hipparcos where name="HIP 71348"; HIP 71348|218.87831588|-89.771696000000006 sqlite>
インポートできました。今回はここまで。
コメント