vcf2csv 與 csv2vcf: 試算表與 Android 通訊錄互相轉換檔案格式

(English version)

還好老婆買的新手機是 HTC Aria 而不是 iPhone。 所以我決定值得花一些時間, 幫她把試算表檔案裡面的通訊錄轉換到她的智慧手機上面。 在這裡分享三支小程式, 方便大家將通訊錄在 .vcf 與 .csv 兩個格式之間互轉。 前者是 Android 的格式; 後者方便電腦上試算表軟體編輯。 快速使用指南: 將 即時打包檔 解壓縮, 然後就可以在 linux 電腦上:

  1. 產生可編輯的檔案: ./qp28bit < contacts.vcf | ./vcf2csv > editable.csv
  2. 用 oocalc 編輯 editable.csv
  3. 將它轉回 vcf 檔讓 Android 匯入: ./csv2vcf < editable.csv > new-contacts.vcf

以下是詳細解說:

  1. qp28bit 把 .vcf 檔案裡面每一個 (可能跨越數列的) quoted-printable 編碼字串改成全部放在同一列的 8-bit 編碼字串。 例如: ./qp28bit contacts.vcf > contacts-8bit.vcf 會將解碼完的字串放入新的檔案 contacts-8bit.vcf 當中, 方便你使用任何純文字編輯器閱讀/編修。 對於 Android 所匯出的檔案, 有時我必須如此解碼兩次。
  2. vcf2csv不含跨列欄位的 Android 的通訊錄格式 .vcf 轉成試算表格式 .csv。 更精確地說, (1) 請先用 qp28bit 處理過您的 .vcf 檔, 再餵給 vcf2csv 吃 (2) PHOTO 欄位會默默地消失。 例如: ./vcf2csv contacts-8bit.vcf > editable.csv 將 contacts-8bit.vcf 轉成 calc (OO.o 的試算表軟體) 可以讀取的 editable.csv。 若在命令列上指定 -d, 則可更改分隔符號 (原本是 ",")。 例如: ./csv2vcf -d '#' contacts.vcf > editable.csv 所產生 csv 檔採用井號而非逗號作為分隔符號。
  3. csv2vcf 把試算表檔案轉成 Android 的通訊錄格式。 例如: ./csv2vcf editable.csv > new-contacts.vcf 將 editable.csv 轉成 new-contacts.vcf . 如果您的輸入檔案所採用的分隔符號不是逗號, 也可在命令列上指定 -d 選項。

這些程式碼超級精簡, 只能處理最普通的檔案, 而且沒有防錯機制。 更明確地說:

  1. 這些程式不處理引號。 也就是說, 您的資料內不可含有逗號; 或者, 若一定要用逗號, 那麼您就必須用 -d 指定不同的分隔符號。
  2. 這些程式都假設入資料採用 utf8 字元集。 如果你查看 qp28bit 的原始碼就會明顯地看到這個假設。 若您的試算表軟體匯出檔案時, 採用其他字元集 (例如 big5, gb2312, ...), 則需要先用 iconv 指令轉檔。
  3. csv2vcs 採用比較簡單的 8-bit encoding 而不是原來比較複雜的 quoted-printable encoding。 總之 Android 可以接受就好了。
  4. 三支程式的輸出格式都採用 Linux 格式的換列 -- 換列字元是 LF 單獨一個, 而非 CR LF 兩個字元。

好吧, excel 也可以讀寫 csv 檔啦。 但是下次請給 OO.o 一個機會, 好嗎? 就當做是對我的回饋吧。

不同廠牌手機及應用軟體的注意事項

不同廠牌的智慧手機, 或不同的應用軟體, 所採用的欄位名稱可能略有出入。 以下列出我所知道的手機及軟體的注意事項:

  1. 欲匯入 vcf 檔至 gmail, 應先將所有的 "EMAIL;INTERNET" 改為 "EMAIL;HOME", 變成 像這樣
  2. 欲匯入 csv 檔至 zimbra, 應先將欄位名稱改為: "firstName", "lastName", "fullName", "homePhone", "mobilePhone", "workPhone", "email", "email2",... 等等, 變成 像這樣

留言/討論?

您有使用上的問題嗎? 請到 這帖部落格 留言。

歷史