文字列から緯度経度を正規表現を用いて取得する
汚らしいファイル
例えばGBIFからダウンロードしたCSVから緯度経度情報だけを取得したい。
GBIFは様々な生物の分布データをまとめたサイトだ。
ここからサンプルデータのテーブルをダウンロードでき、今回は研究用にサンプルの緯度経度情報が必要だったためダウンロードしてみた。
1985,8115093,8115093,HUMAN_OBSERVATION,UQ,ConsAtlas,waust5.dat-W225-1-1891-8,,,,CC_BY_4_0,,,,,2018-12-20T11:22:52.170Z,,",,,,,, "1937455545,d7349b4a-5b9e-414f-94a2-418af65425ce,1920d7af-8a8e-4bdd-9319-09b0cd92cc8f,Plantae,Tracheophyta,Magnoliopsida,Solanales,Solanaceae,Anthocercis,Anthocercis littorea,,SPECIES,Anthocercis littorea Labill.,AU,,bd7b90ae-dc67-4844-9765-fb01a39c633d,-32.866667,115.674376,1000.0,,,,,,1980-01-01T00:00:00Z,,,1980,8115093,8115093,HUMAN_OBSERVATION,UQ,ConsAtlas,waust5.dat-W227-2-1927-2,,,,CC_BY_4_0,,,,,2018-12-20T11:22:51.691Z,,",,,,,, "1937455169,d7349b4a-5b9e-414f-94a2-418af65425ce,f4fb1579-6d11-4e7a-
これがデータの一部なのだが、どうも区切り文字がうまく入っていないようだ。
汚い上に、なんやかんやしてもデータフレームとして取り出せない。
このままcsvで読み込んでRに処理させるつもりだったのに。
仕方ないのでtxtで保存しreと正規表現を使って座標情報を取得する。
import re f = open('tst2.txt') ##上述文字列の入っているファイル text = f.read() f.close() tlist=list() for string in re.finditer(("(-|[0-9]){1,4}\.([0-9]){0,6},(-|[0-9]){1,4}\.([0-9]){0,6}"),text, re.MULTILINE): ##([0-9]){0,6} 緯度経度情報の小数点以下桁数がバラバラなため0-6で指定しておかないとダメ tlist.append(string.group()) print(tlist)
reライブラリのfinditerを用いることで文章中に含まれるすべてのmatch箇所を返してくれる。
このとき気をつけるのは
string.groups()
としないこと。groupsにすると文字が一文字ずつに分解されてしまう。
これで、含まれている緯度経度をすべてきれいに取得できた。