StatsBeginner: 初学者の統計学習ノート

初学者が統計学、機械学習、R、Pythonの勉強の過程をメモっていくノート。

researchmapに投入するデータをExcelからCSVに変換するスクリプト(Pythonとbash)

以前、reserchmapにCSVでデータを投入するときの注意点を書きました。
researchmapにCSVで論文のデータを投入するときの注意点 - StatsBeginner: 初学者の統計学習ノート


私は論文の業績はあまり無いので(笑)管理が楽なのですが、一般の雑誌に書いてる文章とかもMiscに載せていて、その更新が面倒だったりします。あと、下っ端なので、他の教員の業績を別のデータベースからresearchmapに移行する作業もやらねばと思っています(特に頼まれたわけではないんですが)。最近は、大学(文科省?)がresearchmapを起点に情報管理するようになってきてて、researchmapに情報が入ってさえいれば、大学のよくわからないDBにも自動で取り込んでくれるみたいな感じになっています。


仕事の成果物の一覧が必要になる場面というのはいくつもあり、誰もが、何かしらマスターとなるファイルをつくってると思います。で、私は、マスターとなる情報はエクセルで入力していって、何か提出物が求められたらその様式に合わせて変換するスクリプトをその都度書けばいいかなと思ってて、とりあえずresearchmapのインポート用データ*1の形にあわせたエクセルでやることにしました。情報がけっこう網羅的なので、researchmapにあわせておけば、たいていの形式には変換できると思います。*2


ところで、入力はExcelが扱いやすいのですが、researchmapに投入するためにはクォーテーション付きのCSVを用意する必要があり、Excelから直接出力することができなかったので(Windowsだとできるのかもしれない)、変換用のスクリプトを書いておきました。


内容はめちゃくちゃ簡単で、PythonのPandasで読み込んで、" "付きのCSVを吐き出すだけです。後述のシェルスクリプトを入れても、処理部分はたった9行です。
注意点としては、単に読み込むと、雑誌の号(No.)の列だけは数値として解釈されて「5.0」とかになってしまったので、すべて文字列型として読み込むようにしています。ただ、そうするとこんどは、空白のセルが全部"nan"という文字列になってしまって、これは問題ない場合もありますが特定の列にあるとresearchmapでエラーになるようだったので、空白に変換しています。

import pandas as pd
import csv
import os

# スクリプトが置いてあるディレクトリを取得(これはJupyterとかで実行しようとするとエラーになるので注意)
dir_path = os.path.dirname(os.path.abspath(__file__))
os.chdir(dir_path)

# パスにファイル名を足す
file_path = dir_path + '/RM_paper.xlsx'

# sheet_nameは、シート番号なら数字,シート名なら''で文字列与える
# dtypeで全て文字列型に指定。列ごとに指定したいときは{'列名称' or 列番号:型}と辞書型で与える。
df = pd.read_excel(file_path, sheet_name=1, dtype=str)

# nanを消す(全体から消すならdfにreplaceすればOK)
df = df.replace('nan','')

# 出力。 quotingの設定で,全てに""を付ける。
df.to_csv('RM_paper.csv', index=False, encoding='utf-8', na_rep='', quoting=csv.QUOTE_ALL)


実行は、シェルスクリプトでも書いてファイル置き場においておけば、ダブルクリックするだけでファイルの変換ができますね。
(スクリプトの置き場の取得はこの記事を参考にしました。)

#!/bin/bash

# このスクリプトが置いてあるディレクトリを取得して移動
script_dir=$(cd $(dirname ${BASH_SOURCE:-$0}); pwd)
cd $script_dir

# pythonのスクリプトを実行
python3 convert_rm.py


つまり、どこか適当なフォルダに、

  • RM_paper.xlsx:エクセルファイル(1シート目に必要な情報が入っている)
  • convert_rm.py:↑のpythonのスクリプト
  • convert_rm:↑のbashのスクリプト(Macのデフォルトはこないだbashからzshに変わりましたが)

を置いておいて、convert_rmをダブルクリックすれば、同じフォルダ内に「RM_paper.csv」という名前で変換後のCSVが出てきます。


まあpythonのほうも数行程度なので、シェルスクリプトに全部書けばいいような気もしますが。
変換ができたら、あとはresearchmapに行って、まずいったん業績を一括削除してから、↑で吐き出されるRM_paper.csvをインポートすればいいです。

*1:業績の編集画面でインポート画面から、csvのフォーマとがダウンロードできます

*2:共著者の名前の並べ方を、その都度必要な様式に変えたりするのは面倒ではある。大学のシステムでは、共著者全員をセミコロンで区切って入れる形式になっていて、researchmapは好きな方法で並べた文字列を1つの値として扱うようになっているが、まぁ後者に合わせることにした。