背景
この記事の続きです。
bibファイルのうち,日本語文献と思しきものに,isjapanese = {true}
という行を自動で追加するPythonプログラムになります。
基本的な流れ
bibファイルの中身は基本的に@で区切られているのでsplitで分解できます。
- @の文字で文章をsplit
- ブロックごとに2バイト文字が存在するか判定
- 日本語判定を受けたブロックの後ろを置換
- @をつけ直して再構成,ファイルに書き込み
という流れをとりました。
Pythonによる2バイト文字判定
こちらの方の記事を参考にしました。
https://minus9d.hatenablog.com/entry/2015/07/16/231608
#https://minus9d.hatenablog.com/entry/2015/07/16/231608
import unicodedata
def is_japanese(string):
for ch in string:
name = unicodedata.name(ch,'Undefined')
if "CJK UNIFIED" in name \
or "HIRAGANA" in name \
or "KATAKANA" in name:
return True
return False
元記事からの変更点としてunicodedata.name
に改行コードを入れるとErrorを吐くのでデフォルト値として'Undefined'を設定しています。
リファレンスがわかりやすくて助かった…
https://docs.python.jp/3/library/unicodedata.html
その他仕様
python addJPflag.py <元ファイル>.bib
とうつと
<元ファイル>_withJPflag.bib
という名前でフラグ付きのファイルを作成するようにしました。
ソースコード
結構簡単な仕様でしたので割とすぐできました。
退屈なことはPythonにやらせろってはっきりわかんだね。
import unicodedata
import sys
def is_japanese(string):
for ch in string:
name = unicodedata.name(ch,'Undefined')
if "CJK UNIFIED" in name \
or "HIRAGANA" in name \
or "KATAKANA" in name:
return True
return False
if __name__ == "__main__":
argv = sys.argv
if len(sys.argv)==1:
print('Please parse .bib file name!')
exit(-1)
# 1. read file
fname = argv[1]
f = open(fname,encoding="utf-8")
data = f.read()
# 2. split file
sdata = data.split('@')
# 3. add string
output = ''
for strings in sdata:
if is_japanese(strings):
output = output +'@' + strings[:-3] + ',\n isjapanese = {true}\n}\n'
else:
output = output +'@'+ strings
output_bib = output[1:]
# 4. save as new files
fname_o = fname.replace('.bib','_withJPflag.bib')
with open(fname_o,'w',encoding='utf-8') as fo:
fo.write(output_bib)