Конвертер CSV в VCF или перенос телефонной книги с Nokia на Android

На днях одарили меня новым смартфоном, до этого я пользовался исключительно т.н. «звонилкой». Особые слова благодарности компании Nokia за телефон Nokia 6230i. Возник вопрос: как перенести контакты из телефонной книги со старой Nokia на Android? Конечно, можно было воспользоваться копированием контактов на сим-карту, но это не наш метод 🙂

Со тарой Nokia удалось выгрузить CSV-файл с контактами. В этом мне помогла старая софтина от Nokia — Nokia Suite. Заодно вспомнил, что когда-то давным-давно я уже пользовался этой программой 🙂 На выходе получил вот такой файл (для наглядности открыл в Excel):

nokia-vcf

Теперь переходим в новый телефон на Android и узнаём, что контакты в телефонную книгу можно импортировать из аккаунта Google или в формате VCF. Как загружать контакты в Google из .dat файла я узнал значительно позже 😉 Сразу решил посмотреть что это за зверь такой VCF формат. Оказалось, что о нём знает даже русская wiki:

vCard — текстовый формат для обмена электронными визитными карточками. Файл vCard состоит из записей типа vCard, каждая из которых содержит информацию одной визитной карточки. Запись vCard может содержать имя, адрес, номера телефонов, URL, логотип, видео и аудио фрагменты и пр.

Обычно файл vCard имеет расширение .vcf

Ок. Но может существует готовое решение для конвертации из CSV в VCF? Конечно, такая софтина нашлась — программа CSV to vCard с собственным сайтом http://www.csvtovcard.com/ Заставить её работать корректно я не смог,  Менял разделители в исходном файле, пробовал немногочисленные настройки, но программа обрабатывала только первую колонку, другие данные не воспринимала. Значит, пишем свой конвертер!

Конвертер CSV to VCard на PHP.

Тщательно изучив документацию по vCard формату Загуглил сэмпл .vcf файла — таковой сразу нашёлся :

В моей базе контактов минимум данных. Каждый контакт — это имя и до трёх телефонных номеров. Поэтому меня интересовали только соответствующие строки vCard файла.

Итак, в моём случае каждая «карточка» контакта в vCard формате выглядит следующим образом:

Алгоритм конвертера из CSV в VCF

Алгоритм конвертера из CSV в VCF достаточно простой: построчно читаем .csv файл и одновременно помещаем данные в массив $arrayData (функция fgetcsv читает строку, по delimiter разбивает её на отдельные элементы и помещает строку в массив). Предварительно преобразовываем данные в кодировку utf8, т.к.  руссая кодировка поддерживается Nokia Suite исключительно в cp1251. Данные строго разделены по колонкам, поэтому проверять их на корректность не вижу необходимости. Первая колонка — это всегда имя, а остальные — номера телефонов. Во второй части скрипта я создал 2 шаблона. Первый шаблон содержит полную структуру «карточки» контакта без строки с номерами телефонов (вместо неё уникальная строка — #num#, которая подлежит замене на строку с номерами телефонов). Второй шаблон — содержит структуру данных для номера(-ов), он необходим для того, чтобы иметь возможность использовать его отдельно и многократно (в соответствии с количеством номеров у обрабатываемого контакта). Перебираем массив, имя абонента подставляем в основной паттерн, а телефон(-ы) подставляем в шаблон для телефонов. Получаем 2 строковых переменных с данными. Переменную с телефонами добавляем в переменную с основным шаблоном. Получаем «карточку» контакта. Итерация повторяется столько раз, сколько контактов содержит массив $arrayData. Все сгенерированные «карточки» присоединяем к одной строке. После чего — строку выводим на экран. Записывать получившуюся строку в какой-либо файл на сервере — излишне, т.к. данные можно выделить, скопировать в буфер, после чего вставить в текстовый редактор и записать в файл *.vcf. Данный файл будет базой данных телефонов в формате vCard.

Данный файл был благополучно «скормлен» новому смартфону и он их благополучно принял.

Поскольку подобный PHP скрипт способен написать любой разработчик, то я добавил коментарии для тех, кто не очень хорошо знаком с этим языком.

Листинг:

P.S. Данный алгоритм можно реализовать сложнее, запутаннее проще, изящнее. Даже в момент написания этой записи я вижу что и где можно исправить, сделать иначе и т.д. Но он написан «на одном дыхании» и предоставляется в виде «как есть».