LINUX.ORG.RU

Как вы редактируете VCF файлы (VCARD список контактов)?

 


0

1

Привет

Хотел бы привести в порядок свою телефонную книгу. Экспортнул контакты из телефона в VCF файл (VCARD), хочу удобно редактировать: фильтровать, сортировать, менять поля сразу нескольким контактам. Из идей только конвертнуть это в таблицу (CSV, например), отредактировать, а потом конвертнуть обратно в VCF. Но может есть другие способы.

А как вы редактируете VCF файлы?

★★★★★

Ответ на: комментарий от anonymous

Открываю в Kontakt и редактирую.

Пробовал. Не пошло.
Во-первых он огромный. Для такой простой задачи - явно перебор.
Во-вторых, редактирование в нем нельзя назвать удобным. Таблично отображение в нем ЕМНИП есть, а вот применить одно значение к группе контактов ЕМНИП нельзя.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от qub

Hobbit писал програмку для этого как раз. Вполне удобная Поищи по doublecontact.

Нашел. На 95% то, что нужно.

Программа на qt5. Импортнуло книгу нормально. Есть сортировка, какая-то фильтрация. Позволяет балково редактировать некоторые поля.

Из минусов.

Управление немного неудобное. Например, зажать-провести мышкой - удобней было бы выделять, чем drag'n'drop. Пока добавлял колонки намучался; и вообще почему по дефолту не все колонки видны? Чтобы начать сортировку, мало кликнуть по заголовку колонки; нужно сначала нажеть F4; зачем?

И непонятные ограничения. Например балково я могу отредактировать только Title, Organization, Description; А если я хочу заменить всех Alexander на Aleksandr?
Фильтрация, отдельно по каждому полю не возможна.

Программа явно заточена то перетаскивание контактов из одной адресной книги в другую. У меня use case другой: приведение в порядок сотен контактов. И опять по UI автор переписал свойства обыкновенных электронных таблиц. Можно, но зачем?

В любом случае спасибо. Это пока самое близкое, но буду искать еще.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

зажать-провести мышкой - удобней было бы выделять, чем drag'n'drop.

Можно зажать Shift и провести стрелкой на клавиатуре вверх-вниз. Но воообще, drag'n'drop я добавлял отдельно по просьбе пользователей. Может, сделаю его отключаемым...

Например балково я могу отредактировать только Title, Organization, Description; А если я хочу заменить всех Alexander на Aleksandr?

Не для всех полей групповое редактирование получается сделать однозначным образом. Для имён — вроде бы, можно, но даже их в контакте может быть до 5, они зачастую перепутаны и/или объединены (как раз для исправления этого бардака в программе средства есть). Подумаю ещё раз над расширением этого диалога... А всяких телефонов/email/адресов вообще может быть произвольное количество в одном контакте.

и вообще почему по дефолту не все колонки видны?

Их даже сейчас столько, что ни в один монитор не влезут. А если ещё для каждого тега из RFC колонку предусмотреть... Их, кстати, можно не по одной добавлять, групповое выделение в настройках («столбцы») имеется.

Фильтрация, отдельно по каждому полю не возможна.

По каждому из видимых столбцов или каждому из вообще полей, которые в vCard есть? Второе - необъятная задача (ну если только ограничиться основными полями).

У меня use case другой: приведение в порядок сотен контактов.

Ну половина функций программы (всякие обмены/слияния/разделения) как раз на это и направлена. Плюс конвертирование разных форматов. Но в принципе, да: если фильтрацию и групповое редактирование усовершенствовать, приведение в порядок будет более гибким. Программа пишется в одну харю (не считая чудом появляющихся переводчиков) в редкие минуты досуга.

И опять по UI автор переписал свойства обыкновенных электронных таблиц.

Вот это не понял...

hobbit ★★★★★
()
Последнее исправление: hobbit (всего исправлений: 1)

И кстати: программа, помимо прочего, умеет переводить VCF в CSV и назад. В том числе есть «универсальный профиль», задача которого — вытащить из VCF ВСЕ поля.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

TL;DR Если лень читать эту портянку, то 1) спасибо, с экспортом в csv, похоже, твоя программа таки решает мою задачу 2) посмотри, пожалуйста, мой pull request.

Не для всех полей групповое редактирование получается сделать однозначным образом.
А всяких телефонов/email/адресов вообще может быть произвольное количество в одном контакте.

Да. я знаю. Копался во внутренностях VCF.
Но если у тебя получилось выводить их таблицей, то и групповое редактирование можно сделать аналогичным образом. Описал ниже как можно сделать.

и вообще почему по дефолту не все колонки видны?

Их даже сейчас столько, что ни в один монитор не влезут.

А мне и не нужно их сразу все видеть. Мне по ним нужен фильтр, а также я их просматриваю сверху вниз в поиске ошибок. Как в Excel.

А если ещё для каждого тега из RFC колонку предусмотреть...

По-хорошему, должен быть набор обязательных полей + все те , которые пришли из файла.

Их, кстати, можно не по одной добавлять, групповое выделение в настройках («столбцы») имеется.

Предложение 1: Групповой выделение лучше делать с помощью Ctrl+Сlick, Shift+Click. Просто клик - неудобно.

Предложение 2: При переходе между столбцами, выделение на предыдущем столбце должно сниматься. Это уберегает от ошибки нажать не ту кнопку. Например, я часто что-то выбирал в правой колонке, потом случайно нажимал «>», а потом приходилось искать что же пропало из левой колонки.

Предложение 3: А вобще как пользователь, я ожидал, что колонки добавляются по правому клику на заголовках таблицы; меняются местами - перетаскиванием заголовка колонки. Кстати, там же и фильтр хорошо бы иметь.

По каждому из видимых столбцов или каждому из вообще полей, которые в vCard есть? Второе - необъятная задача (ну если только ограничиться основными полями).

По видимым колонкам таблицы. Как в Excel.

И опять по UI автор переписал свойства обыкновенных электронных таблиц.

Вот это не понял...

Функции аналогичные электронным таблицам были бы очень кстати. Навигация по полям (не только по строкам), inline-редактирование с помощью F2 (вместо двойного клика и большого диалогового окна). Да, знаю, VCF не особо мапится на таблицу, но для простых кейсов должно хватить, а для сложных - диалоговое окно со всеми параметрами.

Что можно сделать удобней чем в Excel|LO Calc:
1) легко менять местами колонки - перетаскиванием мышкой заголовка колонки.
2) фильтр по регулярке и не просто текстом; при этом по каждой колонке. Только тут важно, чтобы заголовки калонок, по которым фильтруются, как-то подсвечивались. И должна быть опция опция «сбросить все фильтры».
3) удобное групповое редактирование: выделить несколько строк, правый клик, Bulk Replace, сразу предлагает для данного поля-колонки только для выделенных строк поменять одну регулярку на другую; по умолчанию в «search» стоит «*», а курсор на replace.

умеет переводить VCF в CSV и назад

О, это интересно.

Поэкспериментировал с экспортом/импортом. Не всё гладко, но вцелом, думаю, справлюсь. А то что «не гладко» как лучше описать: здесь текстом, или ишами на github?

Ещё нашёл неприятную багу чтения из VCF: если в поле присутствует точка с запятой (экранированная, то есть не разделитель), то всё что после неё обрезается. Например, «ORG:Company\;Subsidiary» превращается в «Company\». У меня такого много, мне это критично, так что я исправил сам и создал pull request. Проверь, пожалуйста. Я вообще программирую just for fun, так что мог где-то налажать.

P. S. Но за труд твой спасибо. Похоже, твоя программа таки решает мою задачу.

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 2)
Ответ на: комментарий от Kroz

посмотри, пожалуйста, мой pull request

Спасибо, гляну. Я сейчас с файлами NBU ковыряюсь...

hobbit ★★★★★
()
Ответ на: комментарий от Kroz

посмотри, пожалуйста, мой pull request

Посмотрел. Я, наверное, всё же чуть по-другому сделаю, ибо предложенная реализация, во-первых, ломает совместимость с Qt4, во-вторых, КМК, многовато копипасты, надо как-то оптимизировать. Но за обнаружение и локализацию проблемы спасибо!

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

Не вопрос. Только если ты планируешь использовать QRegExp, то он не поддерживает lookbehind в регулярках. FYI.

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Посмотрел ещё раз. Скорее всего, твои наработки всё-таки буду применять с творческой переработкой. :) Поэтому два вопроса:

1) Я так понимаю, полную замену \; на ; для всех тегов ты делаешь только при чтении, а обратную замену при записи — только для некоторых тегов. Это сделано сознательно, и если да, то почему? Просто после этого получится vcf, который уже точно не прочитается корректно (у меня, например, NOTE портится). Если это просто недоработка — я это внесу на низком уровне куда-нибудь в метод encodeValue, но может, это сделано специально?

2) Нередактируемые и неизвестные теги. Ты там обратную замену делаешь прямо при чтении. Не логичнее ли её делать при записи, чтобы в UI оно отображалось без слеша?

В любом случае PR полезный, проблема действительно существует.

hobbit ★★★★★
()
Ответ на: комментарий от hobbit

1) Я так понимаю, полную замену \; на ; для всех тегов ты делаешь только при чтении, а обратную замену при записи — только для некоторых тегов. Это сделано сознательно, и если да, то почему?

Нет, это я упустил. Насколько я знаю, нужно для всех. Поправь, пожалуйста.
Правда, насколько я понял, есть одно исключение, над которым нужно подумать: нередактируемые и неизвестные теги - см ниже.

2) Нередактируемые и неизвестные теги. Ты там обратную замену делаешь прямо при чтении. Не логичнее ли её делать при записи, чтобы в UI оно отображалось без слеша?

Ты про это?

             // Known but un-editing tags
             else if (
                 tag=="LABEL" || tag=="PRODID"
                 || tag=="X-ACCOUNT" // MyPhoneExplorer YES, embedded android export NO
                     )
             { // TODO other from rfc 2426
                 item.otherTags.push_back(TagValue(vType.replaceInStrings(";", "\\;").join(";"),
                     decodeValue(vValue.replaceInStrings(";", "\\;").join(";"), errors)));
             }
             // Unknown tags
             else {
                 item.unknownTags.push_back(TagValue(vType.replaceInStrings(";", "\\;").join(";"),
                     decodeValue(vValue.replaceInStrings(";", "\\;").join(";"), errors)));
             }

Я мыслил так. Неизвестный тег может быть одним значением, либо массивом с разделителем ';'. У тебя, как я понял, неизвестный тег всегда показывается как строка. То есть если это на самом деле массив, то будет присутствовать разделитель ';' . Тогда логично оставлять экранирование для настоящих ';' , которые не разделитель.

TestCase:
BEGIN:VCARD
VERSION:2.1
N:Surname;Name;;;
FN:Name Surname
X-UNKNOWN:String \; one; String two
END:VCARD

Если убирать экранирование при чтении и добавлять при записи, учитывая, что у тебя показывается это как одна строка, то import-export приведет к тому, что «String \; one; String two» превратится в «String \; one\; String two».

Kroz ★★★★★
() автор топика
Ответ на: комментарий от Kroz

Закоммитил. В части регулярных выражений сделал условную компиляцию (вполне возможно, что со временем более технологичный вариант с QRegularExpression станет основным, а то и единственным), для Qt4 пока сделал немножко громоздкое, но работающее решение.

hobbit ★★★★★
()
28 апреля 2019 г.
Ответ на: комментарий от Kroz

В общем, из твоего списка я две вещи занёс в Issues: интерактивные заголовки, через которые можно настраивать сортировку, фильтрацию и добавление-перемещение столбцов, а также групповую замену по регулярке (но это всё же, наверное, будет не групповое редактирование, а отдельный пункт, он сложнее — групповое редактирование я оставлю, возможно, добавлю туда полей...)

Занёс на будущее. Сейчас я хочу версию 0.2.0 выпустить и двигаться дальше...

hobbit ★★★★★
()
Ответ на: комментарий от qub

Плюсую, классная вещь. Не идеал, конечно, но выбора нет особо, так что хватает.

Dispetcher14 ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.