LoginSignup
0
0

More than 5 years have passed since last update.

Lismoのアドレス帳をVCFに変換する

Posted at

LSIMOのアドレス帳バックアップで取り出せる、アドレス帳はなぜかCSVなので困ります、携帯端末からSDカードにバックアップすればVCFが出てくるのに、なぜかCSVなのです。

lismo2vcf.rb
require 'rubygems'
require 'kconv'
require 'csv'
require 'vpim'
$KCODE='u'
#Authors::   takuya_1st
#Copyright:: @takuya_1st
#License::   GPL
class CSV 
    ## CSVファイルを読み込んで一行目を見出し行として、全部をハッシュに読み込む
    def CSV.csv_to_hash(filename)
        #一行目がヘッダのCSVファイル
        f = CSV.open(filename, "r") 
        header = f.shift
        f.map{|e| 
            Hash[*header.zip(e).flatten]
        }
    end

end


class LismoAddressBook


    def csv_to_vcf_array(filename)
        info_list = csv_to_info(filename)
        vcf_list = info_list.map{|info,k|
            info_to_vcf(info)
        }
    end

    def csv_into_vcf_files(filename)
        list = csv_to_info(filename)
        list.each{|info| 
            save_vcf(info)
        }
    end


    def csv_to_info(csv_file)
        hash_list = CSV.csv_to_hash(csv_file)
        hash_list.map{|e| 
            hash_to_info(e)
        }
    end
    def hash_to_info(hash)
        info ={};

        info['f_name'   ] =  hash["名前"]
        info['l_name'   ] =  "" if false
        info['kana'     ] =  hash["よみ"]
        info['email'    ] =  [hash["Eメール1"], hash["Eメール2"],hash["Eメール3"],hash["Eメール4"],hash["Eメール5"],].select{|e| e}
        info['tel'      ] =  [hash["電話番号1"],hash["電話番号2"], hash["電話番号3"],hash["電話番号4"],hash["電話番号5"], ].select{|e| e}
        info['home_addr'] =  "#{hash["郵便番号"]}  #{hash["住所"]}" if hash["住所"]
        info['birthday' ] =  hash["誕生日"]   if hash["誕生日"]
        info['memo'     ] = "#{hash["メモ"]}" if hash["メモ"] 

        info.delete("tel") if info["tel"].size < 1
        info.delete("email") if info["email"].size < 1
        return info
    end
    def info_to_vcf(info)

        vcard = Vpim::Vcard.create
        vcard << Vpim::DirectoryInfo::Field.create('N;CHARSET=utf-8'        , "#{info['f_name']};#{info['l_name']};;;"  )
        vcard << Vpim::DirectoryInfo::Field.create('FN;CHARSET=utf-8'       , "#{info['l_name']}#{info['l_name']}"      )
        vcard << Vpim::DirectoryInfo::Field.create('X-PHONETIC-FIRST-NAME'  , "#{info['kana']}"      )
        info["email"].each{|mail|
            vcard << Vpim::DirectoryInfo::Field.create('EMAIL;INTERNET'     , "#{mail}" )
        } if info["email"]
        info["tel"].each{|num|
            vcard << Vpim::DirectoryInfo::Field.create('TEL;CELL;VOICE'     , "#{num}" )
        } if info["tel"]
        vcard << Vpim::DirectoryInfo::Field.create('ADR;HOME;CHARSET=utf-8' , "#{info['home_addr']}" )
        vcard << Vpim::DirectoryInfo::Field.create('BDAY;value=date'        , "#{info['birthday']}" )
        vcard << Vpim::DirectoryInfo::Field.create('NOTE;CHARSET=utf-8'     , "#{info['memo']}" )
        vcard.to_s.gsub( /¥r?¥n/, "")
    end

    def save_vcf(info)
        require 'digest/sha1'
        vcf_string = info_to_vcf(info)
        file_name = "#{info["f_name"]}#{info["l_name"]}.vcf"
        file_name = "#{Digest::SHA1.hexdigest(vcf_string)}.vcf" if file_name.strip == ".vcf"
        open("#{info["f_name"]}#{info["l_name"]}.vcf", "w" ){|f|
            f.write vcf_string
        }
        puts "#{file_name} saved."
    end





end



converter = LismoAddressBook.new 
converter.csv_into_vcf_files("./address.csv")


0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0