import unicodedata import adglobal as g import adclass import os import sys import pdb def zhconv(str1): # 住所入力中に郵便番号、電話番号を全角で入れてしまうので、全角数字を半角数字に変換する。住所中の全角数字も半角数字になる。 size = len(str1) s = list(str1) # 文字列内を変更できないので、一旦リストに変換 str2 = [""] * size for k in range(size): c1 = s[k] if c1 in g.z: str2[k] = g.h[g.z.index(c1)] # 全角数字を半角数字に置き換える。 else: str2[k] = s[k] # 全角数字以外はそのまま return ''.join(str2) # リストを文字列に戻す。 def setdir(): g.org_path = os.getcwd() # org_path:カレンとディレクトリ os.chdir(g.ad_path) # カレント・ディレクトリをad_pathに設定 def restoredir(): os.chdir(g.org_path) def setbook(ad_book): # 住所録名ad_bookに基づいて住所録のパス文字列を作って返す。 book_path = ad_path + "\\" + ad_book + ".csv" # ad_book:住所録のパス名 return book_path def name_check(str1): # 名前文字列の確認 size = len(str1) if size == 0 or size > 20: return False # 長さ20字以上の名前は不可ということにする。 return True def postcode_check(str1): # 郵便番号チェック size = len(str1) if size != 8: # 郵便番号文字列の長さは8文字限定 return False c1 = str1.count('-') if c1 == 1: # ハイフン個数は1に限定 m = str1.split('-') # ハイフンで2つの文字列に分けてリストに入れる。 if len(m) == 2: if len(m[0]) == 3 and len(m[1]) == 4: # 最初の文字列の長さは3、2番目の文字列の長さは4 if m[0].isdecimal() and m[1].isdecimal(): # 文字列は数字でできているか? return True # correct postcode return False # illegal postcode def address_check(str1): # 住所文字列の確認(長さが0かどうかしか見ていない) size = len(str1) if size == 0: return False return True def telno_check(str1): # 電話番号の確認 size = len(str1) if size == 0: return False if str1[0] != '0': # '0'から始まらないときは、市外局番が省力されている。 c1 = str1.count('-') if c1 == 1: # ハイフンが1個のときは、m[1]は4文字のはず m = str.split('-') if len(m[1]) == 4: if m[0].isdecimal() and m[1].isdecimal(): return True if c1 == 0: if str1.isdecimal(): return True else: return False # 電話番号の最初の数字が'0'でない場合(市外局番なし)は、ハイフンが2個になることはない。 c1 = str1.count('-') # '0'から始まるときは、市外局番から始まっている if c1 == 2: # ハイフンが2個入っている。 m = str1.split('-') # ハイフンで分割すると3つの文字列ができる。 if len(m[2]) == 4: # m[2]は4文字のはず if m[0].isdecimal() and m[1].isdecimal() and m[2].isdecimal(): return True return False elif c1 == 1: # ハイフンが1個のとき m = str1.split('-') # ハイフンで分割すると2つの文字列ができる。 if len(m[1]) == 4: # m[1]は4文字のはず if m[0].isdecimal() and m[1].isdecimal(): return True return False elif c1 == 0: # ハイフンが入っていない。 if str1.isdecimal(): # このときは、文字数を限定しない。 return True return False # str1は電話番号ではない。 def mail_check(str1): # メール・アドレスのチェック size = len(str1) if size == 0: return False m = list(str1) # 文字列を1文字ずつのリストに分解する。 atc = 0 # atc:'@'を数える。 prc = 0 # prc:'.'を数える。但し、通常文字でクリアする。 cnt = 0 # cnt:文字数を数える。 for c in m: u = ord(c) # 文字のUTF-8コード(shift-JISと同じだが)を取り出す if (u > 47 and u < 58) or (u > 64 and u < 91) or (u > 96 and u < 123) or u == 95: cnt += 1 # 通常文字は文字数をカウント prc = 0 # '.'の連続検知のため通常文字で'.'の数を0にしておく elif u == 64: # '@'検出 if atc > 0: return False # 2個目の'@'はエラー else: if prc > 0: return False # '.'直後の'@'はエラー atc += 1 cnt += 1 elif u == 46: # '.'検出 if prc > 0: return False # '.'の連続はエラー prc += 1 cnt += 1 else: return False # 通常文字の他"@._"以外の文字は使えない if atc == 0: return False # 必ず'@'が1個入るはず。入らなければエラー if cnt > 30: # mail文字列の長さは30文字まで return False # 30文字を超えていたらエラー return True def eachappend(ba, d): # 項目毎のリストに追加する。ba:項目毎リスト。p:1人分データ p = d.p for i, da in enumerate(ba): da.append(p[i]) def len2(str): # 半角全角を考慮した文字列幅の取得 cnt = 0 for c1 in str: if unicodedata.east_asian_width(c1) in "FWA": # 2バイト系文字か? cnt += 2 else: cnt += 1 return cnt def makestr(n, align, w, d, sep): # n:表示項目数, align:左右寄せ, w:表示幅, d:表示文字列 str1 = "" for i in range(n): # i:項目番号 w1 = w[i] # 項目幅 for c1 in d[i]: str1 = str1 + c1 # 幅の限界を超えてもどこまでも書き込む if unicodedata.east_asian_width(c1) in "FWA": # 2バイト系文字か? w1 -= 2 else: w1 -= 1 if w1 > 0: if align[i] == "l": # 左寄せ str1 = str1 + ' ' * w1 # 表示幅の不足する分を半角ブランクで埋める else: # 右寄せ str1 = ' ' * w1 + str1 str1 = str1 + sep return str1 check_func = [name_check, postcode_check, address_check, telno_check, mail_check] # check関数のリスト