ヒッパルコス星表をsqlite3へインポート


(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> 

インポートできました。今回はここまで。

コメント

タイトルとURLをコピーしました