Gmail から Xperia へフリガナを同期する方法 改

自分の環境では上手くいきましたが、最悪データが壊れる恐れがあります。バックアップを忘れずに。自己責任で使用してください。

前記事で Gmail から Xperia へフリガナを同期する方法を書きました。Gmail からエクスポートした CSV を弄る際に

  1. 操作ミスで電話番号の先頭の 0 が消える
  2. メモなどに改行を含むデータを扱えない

という欠点がありました。
そこで CSV を扱う部分を自動化した ruby スクリプトを書きました。ruby が分からない人はゴメンなさい。

# coding: utf-8

require 'nkf'

STDOUT.set_encoding Encoding.default_external

YOMI_NAME_FIELD = 'Yomi Name'
PART_YOMI_FIELD = ['Family Name Yomi', 'Given Name Yomi']

whitespace = false

if ARGV[0] == "-s"
	whitespace = true
	ARGV.shift
end

unless File.exists?(ARGV[0]||"")
	puts "ファイルが指定されていません。あるいは見つかりません。"
	exit 1
end

src = File.open(ARGV[0], "r:UTF-16LE:UTF-8")
dst = File.open(File.join(File.dirname(src),File.basename(src, ".*")+"-new"+File.extname(src)), "w:UTF-16LE")

src.seek 2

def src.read_fields
	fields = nil
	f = ""
	q = false
	skip = false
	each_char{|c|
		if c=='"'
			q = !q
			if !skip
				skip = true
				next
			end
		end
		
		skip = false
		
		if !q
			if c==","
				fields ||= []
				fields.push f
				f=""
				next
			elsif c=="\n"
				fields.push f
				return fields
			end
		end
		f += c
	}
	fields
end

def dst.write_fields(f)
	f.map! {|s|
		s.gsub!('"', '""')
		s = (s.include?(',') || s.include?("\n")) ? '"%s"' % s : s
	}
	puts f.join(',')	
end

# ヘッダの取得などなど
header = src.read_fields
yomi_name_index = header.index(YOMI_NAME_FIELD)
part_yomi_index = PART_YOMI_FIELD.map{|s| header.index(s) }

dst.write_fields header

while f=src.read_fields
	if f[yomi_name_index].empty?
		f[yomi_name_index] = f.values_at(*part_yomi_index).join(whitespace ? ' ':'')
		f[yomi_name_index].gsub!(" ", " ")
		f[yomi_name_index].gsub!(/ +/, " ")
		f[yomi_name_index].strip!
		f[yomi_name_index] = NKF.nkf("-W80 -w80 -h2", f[yomi_name_index])
		f[yomi_name_index] = NKF.nkf("-W80 -w80 -Z4 -x", f[yomi_name_index])
	end
	dst.write_fields f
end

src.close
dst.close

適当なファイル名(fixruby.rb)などで保存して Gmail からエクスポートした google.csv に対して

ruby fixruby.rb google.csv

とすると Xperia のフリガナに対応した新しい csv ファイルが生成されるので、それを Gmail にインポートしてください。