Конвертер для переноса контактов из Outlook в Android, для параноиков (с открытым кодом, без использования синхронизации с гуглом и сторонних утилит)

    Вчера обратился один товарищ, столкнувшийся с проблемой переноса контактов из смартфона на WM6 под новый Андроидофон. После недели тщетных попыток он опустил руки и передал csv-файл, полученный из аутлука, к которому ему довольно просто удалось подключить записную книжку телефона.

    Он перепробовал множество конвертеров и способов, но все они либо не давали нужного результата — быстрого и бесплатного конвертирования в два клика, либо искажали информацию из-за кучерявой реализации локализации его версии Аутлука. Использовать привязку контактов к аккаунту он отказался по религиозно-политическим соображениям, велению внутренней морали или уклада жизни, я не уточнял.

    В результате слегка погуглив, но не найдя простого решения пришлось налабать скриптик на великом и могучем, который создает vcf-файл контактов, который в свою очередь легко импортируется в Андроид стандартными средствами телефона.

    Исходные данные


    Собственно то, с чем пришлось столкнуться.

    CSV

    CSV-файл — обычный текстовый файл в котором каждая строка представляет собой строку таблицы данных, а столбцы внутри строки разделяются символом-разделителем, который может выбираться пользователем и обычно представляет собой знак табуляции, точку с запятой, запятую и т.п. В первой строке зачастую присутствуют не значения данных, а имена полей.

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

    В результате получается текстовый файл подобного формата
    Обращение; Имя; Отество; Фамилия; Суффикс; Организация; Отдел; Должность; Улицарабадрес; Улица2рабадрес; Улица3рабадрес; Городрабадрес; Областьрабадрес; Индексрабадрес; Странарабадрес; Улицадомадрес; Улица2домадрес; Улица3домадрес; Городдомадрес; Областьдомадрес; Потовыйкоддом; Странадомадрес; Улицадругойадрес; Улица2другойадрес; Улица3другойадрес; Городдругойадрес; Областьдругойадрес; Индексдругойадрес; Странадругойадрес; Телефонпомощника; Рабоийфакс; Рабоийтелефон; Телефонраб2; Обратныйвызов; Телефонвмашине; Основнойтелефонорганизации; Домашнийфакс; Домашнийтелефон; Телефондом2;ISDN; Телефонпереносной; Другойфакс; Другойтелефон; Пейджер; Основнойтелефон; Радиотелефон; Телетайптелефонститрами; Телекс; Важность; Вебстраница; Годовщина; Деньрождения; Дети; Имяпомощника; Инициалы; Категории; Клюевыеслова; Кодорганизации; Линыйкод; Отложено; Пол; Пользователь1; Пользователь2; Пользователь3; Пользователь4; Пометка; Потовыйящикдомадрес; Потовыйящикдругойадрес; Потовыйящикрабадрес; Профессия; Расположение; Расположениекомнаты; Расстояние; Руководитель; СведенияодоступностивИнтернете; Серверкаталогов; Супруга; Сет; Сета; Хобби;_астное; Адресэлпоты; Типэлпоты; Краткоеимяэлпоты; Адрес2элпоты; Тип2элпоты; Краткое2имяэлпоты; Адрес3элпоты; Тип3элпоты; Краткое3имяэлпоты; Язык[CRLF]

    ; Кредит;;Bee Line Счет;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;067404;;;067404;;;;;;;; Обычная;;;;;; К.B.L.С.; Служебные;;;;; Не определен;;;;; Обычная;;;;;;;;;;;;;;; ЛОЖЬ;;;;;;;;;;[CRLF]

    Прочие записи

    vCard

    Это формат визитной карточки. В Андроидофонах это основной формат обмена контактами. Если вы пытаетесь отправить контакт по почте или SMS то телефон прицепит именно vcf-карточку. Прелесть формата, в том что в одной карточке (файле) можно объединять несколько контактов.

    Преобразованная запись из примера выше выглядит так
    BEGIN:VCARD
    VERSION:3.0
    CATEGORIES: Служебные
    N:Bee Line Счет; Кредит
    TEL;TYPE=cell:067404
    TEL;TYPE=home:067404
    END:VCARD

    Скрипт-конвертер


    Скрипт написан на удобном, простом, легковесном, кросс-платформенном, и еще куча разных эпитетов awk. В начале указывается разделитель полей внутри csv (мне попался csv с точкой-с-запятой). Далее задается карта отображения полей csv в поля vCard в виде массива KEYS. В общем-то это все настройки, которые должны работать по умолчанию.

    outlook2vcard.awk
    BEGIN {
    	FS = ";"
    
    	KEYS["Фамилия"] = "N.1";
    	KEYS["Имя"] = "N.2"; 	
    	KEYS["Отество"] = "N.3"; 	
    	KEYS["Обращение"] = "N.4";
    	KEYS["Суффикс"] = "N.5";
    	
    	KEYS["Организация"] = "ORG.1";
    	KEYS["Отдел"] = "ORG.2";
    	KEYS["Должность"] = "TITLE";
    	
    	KEYS["Улицарабадрес"] = "ADR;TYPE=work.2";
    	KEYS["Улица2рабадрес"] = "ADR;TYPE=work.2";
    	KEYS["Улица3рабадрес"] = "ADR;TYPE=work.2";
    	KEYS["Городрабадрес"] = "ADR;TYPE=work.3";
    	KEYS["Областьрабадрес"] = "ADR;TYPE=work.4";
    	KEYS["Индексрабадрес"] = "ADR;TYPE=work.5";
    	KEYS["Странарабадрес"] = "ADR;TYPE=work.6";
    
    	KEYS["Потовыйкоддом"] = "ADR;TYPE=home.1";
    	KEYS["Улицадомадрес"] = "ADR;TYPE=home.2";
    	KEYS["Улица2домадрес"] = "ADR;TYPE=home.2";
    	KEYS["Улица3домадрес"] = "ADR;TYPE=home.2";
    	KEYS["Городдомадрес"] = "ADR;TYPE=home.3";
    	KEYS["Областьдомадрес"] = "ADR;TYPE=home.4";
    	KEYS["Индексдомадрес"] = "ADR;TYPE=home.5";
    	KEYS["Странадомадрес"] = "ADR;TYPE=home.6";
    
    	KEYS["Улицадругойадрес"] = "ADR;TYPE=postal.2";
    	KEYS["Улица2другойадрес"] = "ADR;TYPE=postal.2";
    	KEYS["Улица3другойадрес"] = "ADR;TYPE=postal.2";
    	KEYS["Городдругойадрес"] = "ADR;TYPE=postal.3";
    	KEYS["Областьдругойадрес"] = "ADR;TYPE=postal.4";
    	KEYS["Индексдругойадрес"] = "ADR;TYPE=postal.5";
    	KEYS["Странадругойадрес"] = "ADR;TYPE=postal.6";
    	
    	KEYS["Телефонпомощника"] = "TEL;TYPE=pager";
    	KEYS["Рабоийфакс"] = "TEL;TYPE=work;TYPE=fax";
    	KEYS["Рабоийтелефон"] = "TEL;TYPE=work";
    	KEYS["Телефонраб2"] = "TEL;TYPE=work";
    	KEYS["Обратныйвызов"] = "TEL;TYPE=X-EVOLUTION-CALLBACK";
    	KEYS["Телефонвмашине"] = "TEL;TYPE=car";
    	KEYS["Основнойтелефонорганизации"] = "TEL;TYPE=work";
    	KEYS["Домашнийфакс"] = "TEL;TYPE=home;TYPE=fax";
    	KEYS["Домашнийтелефон"] = "TEL;TYPE=home";
    	KEYS["Телефондом2"] = "TEL;TYPE=home";
    	KEYS["ISDN"] = "TEL;TYPE=isdn";
    	KEYS["Телефонпереносной"] = "TEL;TYPE=cell";
    	KEYS["Другойфакс"] = "TEL;TYPE=fax";
    	KEYS["Другойтелефон"] = "TEL";
    	KEYS["Пейджер"] = "TEL;TYPE=pager";
    	KEYS["Основнойтелефон"] = "TEL";
    	KEYS["Радиотелефон"] = "TEL;TYPE=pcs";
    	KEYS["Телетайптелефонститрами"] = "TEL;TYPE=msg";
    	KEYS["Телекс"] = "TEL;TYPE=msg";
    	
    	KEYS["Важность"] = "";
    	KEYS["Вебстраница"] = "URL";
    	KEYS["Годовщина"] = "X-ANNIVERSARY";
    	KEYS["Деньрождения"] = "BDAY";
    	KEYS["Дети"] = "";
    	KEYS["Имяпомощника"] = "X-ASSISTANT";
    	KEYS["Инициалы"] = "";
    	KEYS["Категории"] = "CATEGORIES";
    	KEYS["Клюевыеслова"] = "NOTE";
    	KEYS["Кодорганизации"] = "";
    	KEYS["Линыйкод"] = "";
    	KEYS["Отложено"] = "";
    	KEYS["Пол"] = "";
    
    	KEYS["Пользователь1"] = "";
    	KEYS["Пользователь2"] = "";
    	KEYS["Пользователь3"] = "";
    	KEYS["Пользователь4"] = "";
    	KEYS["Пометка"] = "";
    	KEYS["Потовыйящикдомадрес"] = "";
    	KEYS["Потовыйящикдругойадрес"] = "";
    	KEYS["Потовыйящикрабадрес"] = "";
    	KEYS["Профессия"] = "";
    	KEYS["Расположение"] = "";
    	KEYS["Расположениекомнаты"] = "";
    	KEYS["Расстояние"] = "";
    	KEYS["Руководитель"] = "";
    	KEYS["СведенияодоступностивИнтернете"] = "";
    	KEYS["Серверкаталогов"] = "";
    	KEYS["Супруга"] = "X-SPOUSE";
    	KEYS["Сет"] = "";
    	KEYS["Сета"] = "";
    	KEYS["Хобби"] = "";
    	KEYS["_астное"] = "";
    	KEYS["Адресэлпоты"] = "EMAIL;TYPE=internet";
    	KEYS["Типэлпоты"] = "";
    	KEYS["Краткоеимяэлпоты"] = "";
    	KEYS["Адрес2элпоты"] = "EMAIL;TYPE=internet";
    	KEYS["Тип2элпоты"] = "";
    	KEYS["Краткое2имяэлпоты"] = "";
    	KEYS["Адрес3элпоты"] = "EMAIL;TYPE=internet";
    	KEYS["Тип3элпоты"] = "";
    	KEYS["Краткое3имяэлпоты"] = "";
    	KEYS["Язык"] = "";
    }
    
    FNR == 1 {
    	for (i = 1; i <= NF; i++) {
    		k = KEYS[$i];
    		if ("" != k) {
    			MAPS[i] = k;
    		}
    	}
    }
    
    FNR != 1 {
    	delete PROPS;
    	for (i = 1; i <= NF; i++) {
    		k = MAPS[i];
    		if (("" != $i) && ("" != k)) {
    			PROPS[k] = $i;
    		}
    	}
    	
    	n = asorti(PROPS, SKEYS);
    	if (n > 0) {
    		l = "";
    		print("BEGIN:VCARD");
    		printf("VERSION:3.0");
    		for (i = 1; i <= n; i++) {
    			k = SKEYS[i];
    			v = PROPS[k];
    			if (2 == split(k, a, ".")) {
    				k = a[1];
    				x = 0 + a[2];
    			}
    			else {
    				x = 1;
    			}
    			if (l != k) {
    				l = k;
    				m = 1;
    				printf("\r\n%s:", l);
    			}
    			while (m < x) {
    				m++;
    				printf(";");
    			}
    			printf("%s", v);
    		}
    		print("\r\nEND:VCARD");
    	}
    }
    
    function die(str) {
    	print "Error at " FILENAME ":" FNR " " str
    	exit
    }
    
    function warn(str) {
    	print "Warning at " FILENAME ":" FNR " " str
    }

    Как запускать

    Запускать скрипт из под интерпретатора awk следующим образом:
    gawk -f outlook2vcard.awk inputfile.csv >outputfile.vcf
    

    В качестве входных файлов можно указать несколько файлов csv, тогда они будут объединены.

    Ложка дегтя

    Скрипт автоматически не преобразует кодировку кириллицы в UTF-8, который является родным для Андроида. Этот заключительный аккорд надо сделать вручную либо с помощью iconv для юниксоидов, она же кстати есть и под gnuwin32, либо обычным блокнотом (notepad.exe) для форточек, открыв файл, а затем сохранив с новым именем (Save As...) и выбрав кодировку UTF-8 под именем нового файла.

    Импорт в телефон


    Способ прост и описан в куче блогов и форумов, но не поленюсь и приведу еще раз. Полученный файл с расширением vcf необходимо положить на карту памяти Андроидофона. Затем войти в контакты, нажать кнопку меню и выбрать «Импорт/Экспорт — Импорт с карты памяти», вуаля.
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 18

      +7
      Я делал проще — импортировал CSV в контакты гуглпочты.
        +1
        Я тоже не понимаю, зачем возиться, если можно подключить синхронизацию на wm6 и затем такую же операцию произвести на Android. Дел на пару минут.
          0
          Вариант с гуглопочтой был отвергнут первым, по причине того, что человек отказался привязывать контакты к аккаунту гугла, резона я в этом не видел, но не спрашивал — у каждого свои тараканы.
            +3
            Так вы бы так сразу статью назвали «Конвертер для переноса контактов из Outlook в Android для параноиков». Я начал читать с мыслью «а че нельзя просто в гмэил было закинуть» и по ходу чтения всё пытался понять где туплю, пока до первого комментария не дошел.

            Вообще уважение таким людям, если бы ко мне такой товарищ обратился — я бы ему сказал что никак нельзя и надо вручную на телефоне вбивать…
              0
              Логично, пожалуйста, чтобы другие не «тупили».
              –1
              А почему бы после импорта в csv не сделать экспорт в vcf на том же гмыле? Та даже на своем аккаунте. И не нужно ничего привязывать.
                +2
                Ок, если всем так не нравиться этот вариант, то вот вам другой. После синхры с аутлуком выделяем все контакты, тыцаем в них правой клавишей, выбираем отправить, оправляем на почту (хоть самому себе). Контакты приходят на почту в VCF (один контакт — один файл). Если нужно одним файло создаем батник: copy /B *.* contacts.vcf .
            +1
            В свое время была схожая проблема, решилась на порядок проще — с помощью сервиса Memiana.
            Вся «деятельность» заняла у меня минут 5 ( и то ушло время на скачивания да регистрацию).
              0
              Даже если вам не хочется делать совсем просто, а нужно чуть сложнее, достаточно было просто ввести в гугл поисковый запрос и получить ссылку типа этой:

              How to Export a vCard from Outlook 2010, 2007 & 2003?

              Велосипеды такие велосипеды…
                0
                Человек, который пытался конвертировать контакты довольно не глупый, хорошо владеет английским и умеет искать информацию. Точно не знаю пользовался ли он этими советами, но насколько я вижу эти ребята предлагают свой конвертер, вероятно с блекджеком и девками, а может просто не знающий кириллицу, или не работающий под Ubuntu:
                For such stream, we provide you an efficient vCard converter software which will minimize your time, effort and cost. Software will not only export multiple vCard from Outlook 2003 but also import multiple vCard into your Outlook 2003 application. Give a try to us and take sigh of relief from manual process.


                  0
                  Честно говоря, это первая ссылка, которая бросилась в глаза. Там была куча других. :)
                  Помимо этого, я сразу решил поискать варианты прямой синхронизации Андроида с Аутлуком через USB и тоже нашел ряд вариантов. Они платные, но практически у всех есть time trial, т.е. для разовой синхронизации подходят отлично. Да и платные версии относительно недорогие, если нужно это делать регулярно — от $10. Например, CompanionLink или Android-Sync.

                  P.S. Но, еще раз повторюсь, самым надежным (и к тому же совершенно бесплатным) способом сделать не только разовую синхронизацию, но и обеспечить восстановление всех своих контактов в случае утери телефона является именно синхронизация с облаком. Причем не доверять тому же Гуглу довольно глупо — вряд ли кто-то сможет заплатить достаточно денег для того, чтобы получить информацию от них напрямую, а сломать, имея двухэтапную авторизацию, довольно непросто. Но это, безусловно, не вам совет, а вашему товарищу.
                    0
                    Совет сменить ориентацию он конечно дельный, поговаривают женский оргазм куда более интенсивный. Но все-таки думаю что друзья нужны для того, чтобы помогать в том что мы не можем одолеть сами, а не учить жить, тем более когда это стоит всего полчаса рабочего времени.
                    Будучи полностью согласным, и абсолютно доверяющим гуглу, признаюсь что у меня просто нет секретов, таких, которые нельзя доверить, например, жене. Но если человек спокойнее спит, когда знает что коварные империалисты (а этот закостенелый сухарь не по наслышке знает такие слова) не получат его персональных данных (пусть по его мнению), то пусть это будет так (как пел Джон Леннон, хотя я далеко и не Мать-Мария).
                0
                А к чему, собственно, такие костыли?
                Exchange-синхронизация телефона на WM6 с учетной записью Google, после чего синхронизация Android-аппарата с ней же.
                  0
                  Использовал для этой задачи Android Sync manager, проблем не было…
                    0
                    Стояла такая задача, воспользовался Kies от самсунга, импортировал контакты из локального Outlook, в телефоне они оказались, но вот как же пару сотен контактов теперь привязать к акку гугла? Беда…
                      +1
                      А не надо их в Outlook экспортировать :)
                      Сохраняете их прямо с Kies как .vcf (хоть и нет такого типа файлов в Сохранить как..., но если вручную укажете расширение — сохранится). Далее кучу vcf превращаем в 1:

                      copy *.vcf all_contacts.vcf

                      Ну, и этот один файл загружаем импортом в ГМейл. А уж телефон синхронизируем потом с ним. :)
                        0
                        Спасибо! Попробую!
                        0
                        Если воспользоваться конвертером, или каким еще способом получить vcf, а далее сделать как написано в пункте «Импорт в телефон» то в процессе импорта можно будет выбрать куда импортировать контакты: в телефон или аккаунт.

                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.