#!/cygdrive/c/Python23jp/python # -*- coding: Shift_JIS -*- # # Palmのアドレス帳データから vcardファイルを生成する import palmFile import string, re import sys import kconv import pykf # Palm電話 # 0:Work # 1:Home # 2:Fax # 3:Other # 4:E-mail # 5:Main # 6:Pager # 7:Mobile # 携帯カテゴリ # 1:会社 # 2:個人 # 3:ソフちゃ # 4:多摩Wind # 5:その他 # カテゴリ名のリスト category = ("", "会社", "個人", "ソフちゃ", "多摩Wind", "その他") # Palmカテゴリ # 1:お仕事 # 2:個人的 # 3:産業事本 # 4:CSK # 5:ソフちゃ # 6:釧路高専 # 7:元春ML # 8:高専吹奏楽 # 9:吹奏楽ML # 10:多摩Wind def getCategory(category): # カテゴリ番号を取得する num = 5 if category == 1 or category == 3 or category == 4: num = 1 elif category == 2 or category == 6 or category == 8: num = 2 elif category == 5: num = 3 elif category == 10: num = 4 return num def getTel(address): # 電話番号のリストを取得 tellist = [] for i in range(1,6): phone = "phone" + str(i) id = address[phone + 'LabelID'] # 電話番号が存在して、電話番号の場合 if (id == 0 or id == 1 or id == 7) and len(address[phone + 'Text']) > 0: tel = address[phone + 'Text'].replace("-", "") if id == 0: tellist.append("4WORK:" + tel) elif id == 1: tellist.append("3HOME:" + tel) elif tel.startswith("070"): tellist.append("2PCS:" + tel) elif tel.startswith("090"): tellist.append("1CELL:" + tel) # 電話番号の順番を変更する tellist.sort() # 最初の文字を削除する for i in range(len(tellist)): tellist[i] = tellist[i][1:] return tellist def getMail(address): # メールアドレスのリストを取得 maillist = [] for i in range(1,6): phone = "phone" + str(i) id = address[phone + 'LabelID'] mail = address[phone + 'Text'] # メールアドレスが存在する場合 if id == 4 and len(mail) > 0: if mail.endswith("co.jp") or mail.endswith("csk-inet.or.jp"): maillist.append("4WORK:" + mail) elif mail.endswith("docomo.ne.jp") or mail.endswith("ezweb.ne.jp") or mail.endswith("vodafone.ne.jp"): maillist.append("1CELL:" + mail) elif mail.endswith("pdx.ne.jp"): maillist.append("2PCS:" + mail) else: maillist.append("3HOME:" + mail) # メールの順番を変更する maillist.sort() # 最初の文字を削除する for i in range(len(maillist)): maillist[i] = maillist[i][1:] return maillist class Address: # アドレスを保持するためのクラス # 全部英字を表す正規表現 eng = re.compile('^\w$') # EUCをSJISに変換する toSJIS = kconv.Kconv(kconv.SJIS, kconv.AUTO, kconv.HANKAKU) def __init__(self, address): # 名前をとりだす last = address['lastName'].split('\x01') first = address['firstName'].split('\x01') # 名前が英語かどうかで順番を決める if self.eng.match(last[0]) != None: self.name = '%s %s' % (first[0], last[0]) self.kana = self.name else: self.name = '%s %s' % (last[0], first[0]) self.kana = last[1] if len(first) == 2: self.kana = self.kana + " " + first[1] # ひらがな→カタカナ→半角カタカナに変換する self.kana = self.toSJIS.convert(kconv.Hira2Kata(self.kana)) self.kana = pykf.tohalf_kana(self.kana, pykf.SJIS) # 住所を連結 self.addr = address['state'] + address['city'] + address['address'] self.addr = self.addr.replace("\r\n", " ") self.birth = address['custom1Text'].replace("/", "") self.gno = getCategory(address['category']) self.gn = category[self.gno] # 電話番号を取得 self.tel = getTel(address) # メールアドレスを取得 self.mail = getMail(address) #print "%2d %s" % (address['category'], self.name) def printVcard(self): # Vcard形式で出力する print """BEGIN:VCARD VERSION:3.0 PRODID:TOSHIBA""" print "N:" + self.name + ";;;;" print "FN:" + self.name print "SORT-STRING:" + self.kana # 電話番号を出力 for i in range(len(self.tel)): print "TEL;TYPE=" + self.tel[i] # メールアドレスを出力 for i in range(len(self.mail)): print "EMAIL;TYPE=" + self.mail[i] # その他情報を出力 print "ADR;TYPE=HOME:;" + self.addr + ";;;;;" if len(self.birth) > 0: print "BDAY:" + self.birth print "X-GNO:" + str(self.gno) print "X-GN:" + self.gn print """CLASS:PUBLIC END:VCARD""" # アドレス帳ファイルを読み込む # ここに自分のpalmのアドレス帳ファイルのファイル名を指定する readFile = palmFile.readPalmFile("C:\\Program Files\\Palm\\username\\address\\address.dat") addresses = readFile[0]['addresses'] # # ADDRESS.VCF ファイルを作成する # sys.stdout = open("ADDRESS.VCF", "w") for address in addresses: # カテゴリがお仕事(1)は除く if address['category'] != 1: # 携帯電話の番号があるかどうかを調べる for i in range(1,6): phone = "phone" + str(i) if address[phone + 'LabelID'] == 7: if len(address[phone + 'Text']) > 0: # アドレス情報をVcard用に変換する addr = Address(address) # Vcardを出力する addr.printVcard() continue sys.stdout.close()