Pythonで尾西信用金庫の入出金明細から弥生会計への入力用CSVファイルを作成する

尾西信用金庫

Pythonのコードは以下の通り。

import pandas as pd

# 消費税の計算で四捨五入を行うため
from decimal import Decimal, ROUND_HALF_UP
def r_round(x):
    return int(Decimal(str(x)).quantize(Decimal('0'),rounding=ROUND_HALF_UP))

import os

os.chdir(r'C:\Users\XXXXX\Documents\XXXXX')

df_temp = pd.read_csv('20240820-20241016.csv',encoding='cp932',header = 2,engine='python')
df_temp2 = df_temp.astype('str')
# 後でstr.isdecimal()を使用したいので'str'とする

df_temp2.loc[df_temp2['お支払い金額'].str.isdecimal(),'出金'] = df_temp2['お支払い金額']
df_temp2.loc[df_temp2['お預かり金額'].str.isdecimal(),'入金'] = df_temp2['お預かり金額']
df = df_temp2.astype({'出金': float,'入金': float})

# 出金のデータ作成
# 弥生会計の入力用データと同じ列数のdataframeを作成して、内容をコピーする
# indexを指定しないと、['A']にデータが入らない

df_out = pd.DataFrame(index = df.index,columns=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'])

# #要素の転記

df_out['A'] = '2000'
df_out['B'] = ''
df_out['C'] = ''
df_out['D'] = df['日付'].str[0:4] + '/' + df['日付'].str[5:7] + '/' + df['日付'].str[8:10]

df_out['E'] = '仮払金'
df_out['F'] = ''
df_out['G'] = ''
df_out['H'] = '対象外'
df_out['I'] = df['出金']
df_out['J'] = 0

df_out['K'] = '普通預金'
df_out['L'] = '尾西信金(法人)(API)'
df_out['M'] = ''
df_out['N'] = '対象外'
df_out['O'] = df['出金']
df_out['P'] =  0

df_out['Q'] = df['摘要'].str.strip() + '  ' + df['お預かり金額'].str.strip()
df_out['Q'] = df_out['Q'].str.strip()

df_out['R'] = ''
df_out['S'] = ''
df_out['T'] = '0'
df_out['U'] = ''
df_out['V'] = ''
df_out['W'] = '0'
df_out['X'] = '0'
df_out['Y'] = 'no'

# df['お支払い金額']に金額が入っているデータとindexが一致するデータを抽出する
df_out_dec = df_out[df['お支払い金額'].str.isdecimal()]

#入金のデータ作成

df_in = pd.DataFrame(index = df.index,columns=['A','B','C','D','E','F','G','H','I','J','K','L','M','N','O','P','Q','R','S','T','U','V','W','X','Y'])

# #要素の転記

df_in['A'] = '2000'
df_in['B'] = ''
df_in['C'] = ''
df_in['D'] = df['日付'].str[0:4] + '/' + df['日付'].str[5:7] + '/' + df['日付'].str[8:10]

df_in['E'] = '普通預金'
df_in['F'] = '尾西信金(法人)(API)'
df_in['G'] = ''
df_in['H'] = '対象外'
df_in['I'] = df['入金']
df_in['J'] = 0

df_in['K'] = '仮払金'
df_in['L'] = ''
df_in['M'] = ''
df_in['N'] = '対象外'
df_in['O'] = df['入金']
df_in['P'] =  0

df_in['Q'] = df['摘要'].str.strip() + '  ' + df['お支払い金額'].str.strip()
df_in['Q'] = df_in['Q'].str.strip()

df_in['R'] = ''
df_in['S'] = ''
df_in['T'] = '0'
df_in['U'] = ''
df_in['V'] = ''
df_in['W'] = '0'
df_in['X'] = '0'
df_in['Y'] = 'no'

# df['お預かり金額']に金額が入っているデータとindexが一致するデータを抽出する
df_in_dec = df_in[df['お預かり金額'].str.isdecimal()]

# 出金データと入金データを連結する
# sort_indexを行うことにより、データの並び順が元の入出金明細と同じになる
df_concat = pd.concat([df_out_dec, df_in_dec]).sort_index()

# ['Q']に格納された文字列から、勘定科目等を判定する
df_concat.loc[df_concat['Q'] == 'AAAAA', ['E','F']] = ['未払金','AAAAAカード']

df_concat.loc[df_concat['Q'] == 'BBBBB', ['E','F','H']] = ['リース料','BBBBBファイナンス','課対仕入内10%適格']

df_concat.loc[df_concat['Q'].str.contains('CCCCC'), ['E','F']] = ['買掛金','CCCCC']

# 必要に応じて消費税額を計算
df_concat.loc[df_concat['H'] == '課対仕入内10%適格', 'J'] = df_concat['I'] - (df_concat['I']/1.1).map(r_round)

# 金額の入っている列をint型に変換する
df_concat_int = df_concat.astype({'I': int,'O': int})

#csvファイルに書き込み
df_concat_int.to_csv('py_yokin.csv',encoding = 'cp932',header = False,index = False)

 

尾西信用金庫の入出金明細のデータの形式について

わかりにくですが、タイトル行はCSVファイルの3行目にあたるので、読み込みの際にはheader = 2を指定します。

尾西信用金庫の入出金明細のデータを見ると、そのタイトル名は

‘日付’ ’摘要’ ’お支払い金額’ ’お預かり金額’ ’残高’ となっていますが、

‘お支払い金額’の欄に金額が入っている場合には’お預かり金額’の欄に文字列が入っている場合があり、反対に’お預かり金額’の欄に金額が入っている場合には’お支払い金額’の欄に文字列が入っている場合があります。

つまり、預金通帳を開いて見た場合と同じレイアウトのCSVファイルになっています。通帳の場合には、スペースの関係からこういったレイアウトになってしまうのにも理由があると思うのですが、CSVファイルにおいてこのレイアウトを踏襲する必要があるのか、疑問に思います。

また、CSVファイルではこれらの欄に入力されている文字列の後を、一定の文字数に達するまで全角の空白で埋めているかたちになっていて、その結果ファイルを読み込むと余分な空白が付いてくることになります。

‘摘要’・’お支払い金額’・’お預かり金額’に入っている文字列の取り扱いについては、まず

‘摘要’の文字列の空白を削除したもの + 半角の空白2つ + ’お支払い金額’又は’お預かり金額’の空白を削除したもの

を作成し、そのままだと文字列の前後に空白ができてしまうことがあるため、さらにその空白を削除したものを弥生会計の入力用データの摘要欄に入れるようにしています。

タイトルとURLをコピーしました