Fixed conflict utils file and folder
This commit is contained in:
0
rog/utils_code/__init__.py
Normal file
0
rog/utils_code/__init__.py
Normal file
83
rog/utils_code/date_converter.py
Normal file
83
rog/utils_code/date_converter.py
Normal file
@ -0,0 +1,83 @@
|
||||
# utils/date_converter.py
|
||||
from datetime import datetime, date
|
||||
from typing import Optional
|
||||
|
||||
class DateConverter:
|
||||
"""
|
||||
日本語の日付文字列を扱うユーティリティクラス
|
||||
"""
|
||||
|
||||
def convert_date(self, date_str: str) -> Optional[date]:
|
||||
"""
|
||||
日本語の日付文字列をdateオブジェクトに変換する
|
||||
|
||||
Args:
|
||||
date_str: 変換する日付文字列(例: '1990年1月1日' or '1990-01-01' or '1990/01/01')
|
||||
|
||||
Returns:
|
||||
変換されたdateオブジェクト。変換できない場合はNone
|
||||
"""
|
||||
if not date_str or date_str.strip() == '':
|
||||
return None
|
||||
|
||||
try:
|
||||
# 全角数字を半角数字に変換
|
||||
date_str = date_str.translate(
|
||||
str.maketrans('0123456789', '0123456789')
|
||||
)
|
||||
date_str = date_str.strip()
|
||||
|
||||
# 区切り文字の判定と分割
|
||||
if '年' in date_str:
|
||||
# 年月日形式の場合
|
||||
date_parts = date_str.replace('年', '/').replace('月', '/').replace('日', '').split('/')
|
||||
elif '/' in date_str:
|
||||
# スラッシュ区切りの場合
|
||||
date_parts = date_str.split('/')
|
||||
elif '-' in date_str:
|
||||
# ハイフン区切りの場合
|
||||
date_parts = date_str.split('-')
|
||||
else:
|
||||
return None
|
||||
|
||||
# 部分の数を確認
|
||||
if len(date_parts) != 3:
|
||||
return None
|
||||
|
||||
year = int(date_parts[0])
|
||||
month = int(date_parts[1])
|
||||
day = int(date_parts[2])
|
||||
|
||||
# 簡単な妥当性チェック
|
||||
if not (1900 <= year <= 2100):
|
||||
return None
|
||||
if not (1 <= month <= 12):
|
||||
return None
|
||||
if not (1 <= day <= 31):
|
||||
return None
|
||||
|
||||
return date(year, month, day)
|
||||
|
||||
except (ValueError, IndexError, TypeError):
|
||||
return None
|
||||
|
||||
def format_date(self, d: date, format_type: str = 'ja') -> str:
|
||||
"""
|
||||
dateオブジェクトを指定された形式の文字列に変換する
|
||||
|
||||
Args:
|
||||
d: 変換するdateオブジェクト
|
||||
format_type: 出力形式 ('ja': 日本語形式, 'iso': ISO形式)
|
||||
|
||||
Returns:
|
||||
変換された日付文字列
|
||||
"""
|
||||
if not isinstance(d, date):
|
||||
return ''
|
||||
|
||||
if format_type == 'ja':
|
||||
return f"{d.year}年{d.month}月{d.day}日"
|
||||
elif format_type == 'iso':
|
||||
return d.isoformat()
|
||||
else:
|
||||
return str(d)
|
||||
119
rog/utils_code/name_splitter.py
Normal file
119
rog/utils_code/name_splitter.py
Normal file
@ -0,0 +1,119 @@
|
||||
# utils/name_splitter.py
|
||||
from typing import Tuple
|
||||
|
||||
class NameSplitter:
|
||||
"""
|
||||
日本語の氏名を扱うユーティリティクラス
|
||||
"""
|
||||
|
||||
def split_full_name(self, full_name: str) -> Tuple[str, str]:
|
||||
"""
|
||||
フルネームを姓と名に分割する
|
||||
|
||||
Args:
|
||||
full_name: 分割する氏名(例: '山田 太郎' or '山田 太郎' or 'Yamada Taro')
|
||||
|
||||
Returns:
|
||||
(姓, 名)のタプル。分割できない場合は(フルネーム, '')を返す
|
||||
"""
|
||||
if not full_name:
|
||||
return ('', '')
|
||||
|
||||
try:
|
||||
# 空白文字で分割(半角スペース、全角スペース、タブなど)
|
||||
parts = full_name.replace(' ', ' ').split()
|
||||
|
||||
if len(parts) >= 2:
|
||||
last_name = parts[0]
|
||||
first_name = ' '.join(parts[1:]) # 名が複数単語の場合に対応
|
||||
return (last_name.strip(), first_name.strip())
|
||||
else:
|
||||
# 分割できない場合は全体を姓とする
|
||||
return (full_name.strip(), '')
|
||||
|
||||
except Exception:
|
||||
return (full_name.strip(), '')
|
||||
|
||||
def join_name(self, last_name: str, first_name: str, format_type: str = 'ja') -> str:
|
||||
"""
|
||||
姓と名を結合して一つの文字列にする
|
||||
|
||||
Args:
|
||||
last_name: 姓
|
||||
first_name: 名
|
||||
format_type: 出力形式 ('ja': 日本語形式, 'en': 英語形式)
|
||||
|
||||
Returns:
|
||||
結合された氏名文字列
|
||||
"""
|
||||
last_name = last_name.strip()
|
||||
first_name = first_name.strip()
|
||||
|
||||
if not last_name and not first_name:
|
||||
return ''
|
||||
|
||||
if not first_name:
|
||||
return last_name
|
||||
|
||||
if not last_name:
|
||||
return first_name
|
||||
|
||||
if format_type == 'ja':
|
||||
return f"{last_name} {first_name}" # 全角スペース
|
||||
elif format_type == 'en':
|
||||
return f"{first_name} {last_name}" # 英語形式:名 姓
|
||||
else:
|
||||
return f"{last_name} {first_name}" # デフォルト:半角スペース
|
||||
|
||||
def normalize_name(self, name: str) -> str:
|
||||
"""
|
||||
名前の正規化を行う
|
||||
|
||||
Args:
|
||||
name: 正規化する名前文字列
|
||||
|
||||
Returns:
|
||||
正規化された名前文字列
|
||||
"""
|
||||
if not name:
|
||||
return ''
|
||||
|
||||
# 空白文字の正規化
|
||||
name = ' '.join(name.split()) # 連続する空白を単一の半角スペースに
|
||||
|
||||
# 全角英数字を半角に変換
|
||||
name = name.translate(str.maketrans({
|
||||
' ': ' ', # 全角スペースを半角に
|
||||
'.': '.',
|
||||
',': ',',
|
||||
'!': '!',
|
||||
'?': '?',
|
||||
':': ':',
|
||||
';': ';',
|
||||
}))
|
||||
|
||||
return name.strip()
|
||||
|
||||
def is_valid_name(self, name: str) -> bool:
|
||||
"""
|
||||
名前が有効かどうかをチェックする
|
||||
|
||||
Args:
|
||||
name: チェックする名前文字列
|
||||
|
||||
Returns:
|
||||
名前が有効な場合はTrue、そうでない場合はFalse
|
||||
"""
|
||||
if not name or not name.strip():
|
||||
return False
|
||||
|
||||
# 最小文字数チェック
|
||||
if len(name.strip()) < 2:
|
||||
return False
|
||||
|
||||
# 記号のチェック(一般的でない記号が含まれていないか)
|
||||
invalid_chars = set('!@#$%^&*()_+=<>?/\\|~`')
|
||||
if any(char in invalid_chars for char in name):
|
||||
return False
|
||||
|
||||
return True
|
||||
Reference in New Issue
Block a user