PythonのCSV読み書きで生年月日をもとに年齢計算（誕生日前日に加齢）

# 概要
CSVデータ内の生年月日をもとに、
誕生日前日に歳をとる方法で現在年月日時点の年齢を計算します。


# infile.csv
![スクリーンショット 2019-04-29 20.29.46.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151818/08084e5d-972d-f582-37a9-4b78cc50fc91.jpeg)


# コード

```Python:agechk.py
# CSVファイルを読み書きするため、標準ライブラリcsvを使用する。
import csv
# 現在時刻の取得を行うため、標準ライブラリdatetimeを使用する。
from datetime import datetime
# うるう年の判定で、標準ライブラリcalenderを使用する。
import calendar

# 与えた年がうるう年かどうか確認する関数（0:うるう年でない,1:うるう年）
# 上記calenderを用いる場合は不要。今回は使用しない。
def uruchk(chkyear):
    chk = 0
    if chkyear % 4 == 0:
        if chkyear % 100 == 0:
            if chkyear % 400 == 0:
                chk = 1
        else:
            chk = 1
    return chk

# 処理開始
with open('infile.csv') as infile, \
     open('outfile.csv', 'w', encoding='utf-8') as outfile:
    count = 0
    for line in infile:
        # 読み込んだ行の項目を順にカンマ区切りで対応する変数へ文字列としてmapする。
        number, name, birthymd, sex, yubin, adress, katagaki, \
         sinseiymd, ninteiymd, happuymd, syubetu, pet, nowymd_test = map(str, line.split(','))
        if count > 0:
            # 2019/04/28 18:48:05 = datetime.now().strftime("%Y/%m/%d %H:%M:%S")
            nowymd = datetime.now().strftime("%Y%m%d")

            # 今回は法令対応（生年月日の前日に歳をとる）した処理を行う。
            # 0 1 2 3 4 5 6 7 8 <-- 文字列スライス位置確認。
            # |y|y|y|y|m|m|d|d|
            # 判断材料：生まれ年月日
            b_year  = int(birthymd[0:4])
            b_month = int(birthymd[4:6])
            b_day   = int(birthymd[6:8])
            # 判断材料：現在年月日
            n_year  =   int(nowymd[0:4])
            n_month =   int(nowymd[4:6])
            n_day   =   int(nowymd[6:8])
            # 判断材料：テスト用現在年月日
            #n_year  =   int(nowymd_test[0:4])
            #n_month =   int(nowymd_test[4:6])
            #n_day   =   int(nowymd_test[6:8])

            # まず単純に年を差し引きし、年齢にセットする
            age = n_year - b_year
            # 現在月と生まれ月が同じ月のとき            
            if n_month == b_month:
                # 現在日が生まれ日付の前日より前ならば−１する
                if n_day < (b_day - 1):
                    age = age - 1
            # 現在月が生まれ月のひと月前のときは、生まれ日付１日の場合を考慮する
            elif n_month == (b_month -1) or \
                 n_month == 12 and b_month == 1:
                # 生まれ日付が１日で、現在日付が月末日より前日ならば−１する
                if n_month in {1,3,5,7,8,10,12}:
                    if b_day == 1 and n_day < 31:
                        age = age - 1
                if n_month in {4,6,9,11}:
                    if b_day == 1 and n_day < 30:
                        age = age - 1
                # 現在月が２月のときは、現在年がうるう年の場合の判断基準日29も加味する
                if n_month in {2}:
                    if calendar.isleap(n_year):
                        if b_day == 1 and n_day < 29:
                            age = age - 1
                    else:
                        if b_day == 1 and n_day < 28:
                            age = age - 1
            # 現在月と生まれ月とが異なり、現在月が生まれ月のひと月前ではなく(月差が2以上あり)、
            # かつ現在月が生まれ月を超えないときは、一律−１する
            elif n_month < b_month:
                age = age - 1

            print(f'番号 {number} の {name} は {birthymd[0:4]}/{birthymd[4:6]}/{birthymd[6:8]} 生まれ。 {nowymd_test[0:4]}/{nowymd_test[4:6]}/{nowymd_test[6:8]} 現在、{age}歳です。', file=outfile)
            #print(f'番号 {number} の {name} は {birthymd[0:4]}.{birthymd[4:6]}.{birthymd[6:8]} 生まれ。 {nowymd[0:4]}.{nowymd[4:6]}.{nowymd[6:8]} 現在、{age}歳です。', file=outfile)
        count = count + 1
    # 項目名列は処理対象の行としてカウントしない
    count = count - 1
    print(f'{count} 件を処理しました。',file=outfile)
```


# outfile.csv　
![スクリーンショット 2019-04-29 20.29.20.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/151818/1180f3ed-c936-3777-8e65-e55a3c528355.jpeg)

# おわり
できたー　と思う。