蝸牛の歩み

蝸牛の如く,ゆっくりでも着実に前へ・・・

学名から種小名、亜種名を取り出すexcel関数

GBIFへ標本データを登録するためのデータ整形の続き。今度は、学名を属名、種小名、亜種以下のタクソンに分割する作業。「標本データ変換ツール」なるソフトを使えばできることになっているが、実際にやってみると学名の中に亜属が入っている場合に誤動作してしまう。エクセル関数も教えてもらったが、それも同様に亜属があるとダメ。しょうがないので、半日くらいかけて関数を修正した。ややこしすぎて頭がウニになりそう。

あとで考えれば、関数を書くより手作業で分割した方が早かったんじゃないかという。需要があるとは思えないけど、せっかくなので公開。ただし自己責任で。バグレポ歓迎。

仕様

以下の各パターンの学名を、属名、種小名、亜種以下のタクソンに分ける。亜種以下のタクソンがある場合は、亜種以下のランクに「subsp」と入れる。

学名 属名 種小名 亜種以下のランク 亜種以下のタクソン
Genus species Genus species
Genus species subspecies Genus species subsp subspecies
Genus (Subgenus) species Genus species
Genus (Subgenus) species subspecies Genus species subsp subspecies

以下、学名が入っているセルを「学名」とする。

属名を求める関数

=LEFTB(学名,FINDB(" ",学名,1)-1)

種小名を求める関数

=IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1)),IF("("=LEFTB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1),IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1))), LEFTB(RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1),FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1))),RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1)),LEFTB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1)-1)),RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)))

亜種以下のランクを求める関数

ただしランクは"subsp"決めうち。

=IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1)),IF("("=LEFTB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1),IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1),1)),"subsp",""),"subsp"),"")

亜種以下のタクソンを求める関数

=IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1)),IF("("=LEFTB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1),IF(ISNUMBER(FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1),1)),RIGHTB(RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1),LENB(RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1))-FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(")",学名,1)-1),1)),""),RIGHTB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),LENB(RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)))-FINDB(" ",RIGHTB(学名,LENB(学名)-FINDB(" ",学名,1)),1))),"")

既知の問題

  • "Genus cf. hogehoge"という学名だと、種小名"cf."、亜種以下のランク"subsp"、亜種以下のタクソン"hogehoge"になってしまう。
  • "unidentified Family species"という学名だと、(以下略)。