きっかけ
職場には人事部がEXCELで作成してる下記のような社員一覧表があり、月1月初に人事部から各部署へ送付される。
私は社内のITサポート職なので、メールで人名を打つのに加えて、機材表やライセンス表などの管理のために名前を正確に入力する必要がある。
その表の氏名を使ってフィルターかけたりする作業が発生するからです。
打ち間違えや変換ミス、さらには漢字で入力するので、特殊な漢字などはなかなか変換できない。
なので、このEXCELをPythonで変換して、辞書ファイルを作成して、IMEに一括で登録しちゃおう!って算段です。
サンプルデータ
社員番号 | 氏名(全角) | カナ氏名(半角) | 雇用形態 | 所属部署 | 役職 | 備考 |
---|---|---|---|---|---|---|
1001 | 山田 太郎 | ヤマダ タロウ | 正社員 | 営業部 | 課長 | |
1002 | 佐藤 花子 | サトウ ハナコ | 契約社員 | 総務部 | 係長 | |
1003 | 鈴木 一郎 | スズキ イチロウ | 正社員 | 開発部 | 主任 | |
1004 | 高橋 次郎 | タカハシ ジロウ | 派遣社員 | 人事部 | ||
1005 | 田中 美咲 | タナカ ミサキ | アルバイト | 広報部 |
※兼務している人もいるので重複データがある。(重複削除する必要あり)
完成コード
import openpyxl
import unicodedata
import jaconv
import sys
def main():
# ドラックアンドドロップされたファイルのチェック
if len(sys.argv) >= 2:
excel_file = sys.argv[1]
else:
excel_file = '社員一覧表.xlsx'
# EXCELを開いてアクティブなシートを選択
wb = openpyxl.load_workbook(excel_file)
ws = wb.active
# 1行ずつB列とC列の値を取得し、それぞれ処理を行う
with open('人員リストの辞書登録用テキストファイル.txt', 'w', encoding='utf-16') as f:
for row in ws.iter_rows(min_row=2): # 1行目はヘッダーなので除外
c_hankana = row[2].value
b_kanji = row[1].value
if b_kanji is not None and c_hankana is not None:
if check_unique_name(b_kanji):
c_zenkana2 = hankana_to_zenhira2(c_hankana)
f.write(f'{c_zenkana2}\t{b_kanji}\t人名\n')
else:
pass
# 半角カタカナを全角ひらがなにして頭の2文字を取得
def hankana_to_zenhira2(text):
text = unicodedata.normalize('NFKC', text) # 全角カタカナに変換
text = jaconv.kata2hira(text) # ひらがなに変換
return text[:2] # 最初の2文字のみ抽出
# 名前の重複チェック あればFalse なければTrue
name_list = [] # 関数内で保持する為、関数外で宣言
def check_unique_name(name):
if name in name_list:
return False
else:
name_list.append(name)
return True
if __name__ == '__main__':
main()
概説
使ってるデータは、漢字の氏名とカタカナの氏名のみ
雇用形態や部署などは使ってないです
辞書のユーザーコメントに入れる案はあるけど未実装
人名の最初のよみ2文字で変換すると漢字の氏名が変換されます。
例:やま → 山田 太郎
辞書登録用ファイルを生成するだけですので、生成されたファイルを手動で辞書登録する必要があります。
使用するライブラリ
- openpyxl
- unicodedata
- jaconv
- sys
openpyxl
PythonでExcelを操作する
unicodedata
半角カタカナを全角カタカナに変換する
jaconv
カタカナをひらがなに変換
sys
Exe化して、そのExeにExcelファイルをドラックアンドドロップして実行する仕組みを実装したため
所感
重複データあっても、辞書登録する際に重複データは弾かれるので不要っちゃ不要
Pythonはループが楽だなぁ~