LINUX.ORG.RU

Как экспортировать адресную книгу?

 ,


0

1

Sylpheed 3.5.1

Желательно в vCard экспортировать.

UPD

есть программа, перегоняющая XML, в котором сабж хранит контакты, в CSV, но не работает.

UPD 2

Оказывается в 3.7.0 завезли экспорт в CSV. Можно экспортировать в него, а затем воспользоваться CSV to vCard

Только правильные настройки такие:

Screenshot_20240912_154535.png

Как экспортировать адресную книгу? (комментарий)

Но сам Sylpheed в таком файле пропускает при импорте контакты, у которых заполнен только емейл, без имени. Хотя обратно в него наверное можно импортировать его же CSV, а vCard для импорта в другие приложения.

★★★

Последнее исправление: damix9 (всего исправлений: 4)

Нагуглил только то, что в ~/.sylpheed-2.0/addrbook*.xml лежит адресная книга и ее вроде как можно забэкапить и положить сюда же. Но это не позволяет переносить контакты между клиентами.

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

А как это сделать? Формат XML такой

<?xml version="1.0" encoding="UTF-8" ?>
<address-book name="Личные контакты" >
  ...
  <person uid="727475820" first-name="" last-name="" nick-name="" cn="Zhbert" >
    <address-list>
      <address uid="678377311" alias="" email="zhbert@gmail.com" remarks="" />
    </address-list>
    <attribute-list>
    </attribute-list>
  </person>
  ...
</address-book>
damix9 ★★★
() автор топика
Ответ на: комментарий от foxy_ant

Нашел такой скрипт, запускаю

$ ./sylxml2csv.pl 
Can't locate Text/CSV_XS.pm in @INC (you may need to install the Text::CSV_XS module) (@INC contains: /etc/perl /usr/local/lib/x86_64-linux-gnu/perl/5.26.1 /usr/local/share/perl/5.26.1 /usr/lib/x86_64-linux-gnu/perl5/5.26 /usr/share/perl5 /usr/lib/x86_64-linux-gnu/perl/5.26 /usr/share/perl/5.26 /usr/local/lib/site_perl /usr/lib/x86_64-linux-gnu/perl-base) at ./sylxml2csv.pl line 4.
BEGIN failed--compilation aborted at ./sylxml2csv.pl line 4.
Как пофиксить?

damix9 ★★★
() автор топика
Ответ на: комментарий от Bfgeshka
  1. Поставил 3.7.0 под вайном
  2. Скопировал с заменой файлы ~/.sylpheed-2.0/addrbook*.xml в /home/<username>/.sylpheed/drive_c/users/<username>/Application Data/Sylpheed/
  3. Воспользовался

    Tools/Export to CSV

  4. Установил программу CSV to vCard под вайном
  5. Она ругалась 002e:err:mscoree:CLRRuntimeInfo_GetRuntimeHost Wine Mono is not installed, поэтому запустил ее под mono
    mono ~/.sylpheed/drive_c/Program\ Files/CSV\ to\ vCard/csvtovcard.exe
  6. Настроил https://0x0.st/XxOa.png
  7. Нажал кнопку Convert

Открываю получившийся .vcf в Sylpheed, а там пусто.

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

Установил программу CSV to vCard под вайном

А сначала CSV прочитал, там вменяемая информация? Если CSV ок, по попробуй альтернативы этой CSV to vCard, потому что есть. Например, вот: https://www.fileconverts.com/csv/csv-to-vcard/

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

Можно на питоне накидать быстренько

import xml.etree.ElementTree as ET
tree = ET.parse('/путь/к/файлу.xml')
root = tree.getroot()

for i in root.iter('person'):
    person = i.attrib
    person['address'] = [x.attrib for x in i.iter('address')][0]
    print(person)

На каждой итерации получаешь словарик вот такой:

{'uid': '727475820', 'first-name': '', 'last-name': '', 'nick-name': '', 'cn': 'Zhbert', 'address': {'uid': '678377311', 'alias': '', 'email': 'zhbert@gmail.com', 'remarks': ''}}

Ну и соответственно, вместо print просто нужные элементы в нужном порядке запятой соединяешь и пишешь в файл — в таком csv-формате, как тебе надо.

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

UPD - если сделать название <--> full name, то не пусто, но контактов, у которых эти названия не заполнены, не появляется.

А сначала CSV прочитал, там вменяемая информация?

Да, только у некоторых контактов называние пустое, т.е. заполнен только email, но так и было.

Например, вот: https://www.fileconverts.com/csv/csv-to-vcard/

И здесь та же самая проблема.

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

Ну зачем сразу полдня? Если там нет всяких странностей, и везде одинаково, то всё сразу норм должно получиться. Да и в любом случае, мне кажется, быстрее отдебажить, чем перебирать кучу нерабочих тулзов разнообразных (и в итоге, возможно, всё равно потом написать скрипт и дебажить полдня).

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

И тут я открыл текстовым редактором и обнаружил, что эти контакты без заполненных имен есть и в получаемых обеими конвертерами .vcf. Но Sylpheed их не читает, а экспортированное из яндекса прочитал.

foxy_ant, CrX

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

Мне нужно решение а не разбираться.

В Job?

Вы можете просто помочь а не умничать?

Опять «токсики и хамы» везде мерещатся? Вроде ж даже код дал, только вывод под требуемый формат (примеров которого приведено не было, кстати) переделать и всё, нет, у вас всё равно все «умничают», а не помогают.

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

Я же говорил, что самый лучший линуксовый пакетный менеджер - это wine.

На правах оффтопа:
2 часа потратил на этот пердолинг. Кто мне их вернет? Уже бы вручную переписал эти 100 контактов.

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

+1. Только есть дополнение: колхозить csv через запятые - тупиковый путь, т.к. csv сложнее, чем кажется на первый взгляд. Переводы строк, кавычки - и в самопальном файле будет мусор, ломающий парсеры

Лучше делать через штатный модуль

https://docs.python.org/3/library/csv.html

router ★★★★★
()

Я посмотрел, что там за CSV (Sylpheed 3.7.0). У него даже есть заголовок, но заголовок такого вот вида:

Имя,Фамилия,Название,Псевдоним,Email,Заметки,Алиас

То есть он:

  1. локализован (раньше по этим же граблям плясала хорошая программа OSMO, пока туда поддержку vcf не добавили);
  2. названия полей не такие, как у vcf.

Второе ещё ладно (это всего лишь означает, что импортировать его DoubleContact-ом из коробки не получится), а первое означает, что для программных парсеров этот заголовок практически бесполезен (CSV может быть создан в системе с любой локалью). Его можно только игнорировать, жёстко прибиться к порядку следования столбцов и надеяться, что разработчики Sylpheed не поменяют этот порядок в следующих версиях. Ну и если одному контакту назначить несколько email-ов, она для каждого емейла создаст отдельную строку-контакт, ну это понятно, почему, CSV плоский формат по определению.

Посмотрю, что с этим можно сделать…

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

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

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

А реально нужных столбца всего два.

Ну в принципе перекрещивающихся с vcf - 4 или 5 (имя, фамилия, емейл и заметки, возможно, ещё тип заметок и псевдоним контакта, впрочем, это для тех, кто всегда всё заполняет).

в конвертерах можно задать, какой столбец какому полю соответствует

И получить тот самый «пердолинг». А некоторые ещё и вайн задействуют, и с Mono борются. :/ Практичнее для полезных разновидностей CSV профили добавить, чем вот я и пытаюсь заниматься.

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

Ну в принципе перекрещивающихся с vcf - 4 или 5 (имя, фамилия, емейл и заметки).

У меня есть только полное имя, и то не везде.

И получить тот самый «пердолинг».

Не понял. Выбрать всего один выпадающий список - не пердолинг. Да даже 5 выпадающих списков. Это же делается один раз во много лет. Но конечно хорошо когда конвертер умеет эти настройки запоминать, как вариант - в профилях.

А некоторые ещё и вайн задействуют, и с Mono борются. :/

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

В любом случае, тут оставшаяся проблема - не экспортировать книгу, это уже сделано, и даже не перегнать ее в vCard, а сделать более правильный vCard, чтобы его любой клиент понял. (Или он правильный, это силфид неправильный?)

damix9 ★★★
() автор топика

hobbit, я тут погонял DoubleContact. Прога реально удобная, кстати.

Мне удалось выяснить, что в экспортируемых ей .vcf Sylpheed тоже пропускает контакты без имен. Не пропускает он их только в собственных CSV, там он вместо имени пишет мыло. Правильно читает он только .vcf из яндексовской вебморды. А там, если посмотреть текстовым редактором, то отличие в том, что яндекс ставит каждому контакту еще уникальный id и даже если имени нет, все равно ставит FN: и перенос строки. А остальные проги не ставят даже эти буквы. Я не знаю, что из этого более правильно, но вот на всякий случай сообщил. Возможно, Sylpheed не единственный такой клиент и яндекс так подстраивается под такие кривые клиенты.

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

и даже если имени нет, все равно ставит FN: и перенос строки. А остальные проги не ставят даже эти буквы. Я не знаю, что из этого более правильно

Обязательность тегов была регламентирована только начиная с vCard 4.0 (телефоны сплошь и рядом отдают и требуют древний 2.1, где про это ничего нет). И судя по тому, что там написано, FN (Formatted Name) является обязательным. Так что Яндекс просто придерживается последнего стандарта.

Видимо, мне тоже надо принудительно писать FN, даже если он пустой.

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

Не заглядывал на L.O.R. несколько дней. Был в отъезде.

Вот простенький конвертер адресной книги из XML в формат vCard:

#!/bin/bash
################################################################################
# Convert address book file of XML to vCard format                             #
################################################################################

while read LINE; do
	EXSTAT=`echo $LINE | grep -q "person uid" ; echo $?`
	if [ "$EXSTAT" -eq "0" ]; then
		PUID=`echo $LINE | sed 's/[ ]\+//' | cut -d " " -f 1 | cut -d "=" -f 2 | sed 's/"//g'`
		FIRSTNAME=`echo $LINE | sed 's/[ ]\+//' | cut -d " " -f 2 | cut -d "=" -f 2 | sed 's/"//g'`
		LASTNAME=`echo $LINE | sed 's/[ ]\+//' | cut -d " " -f 3 | cut -d "=" -f 2 | sed 's/"//g'`
		FULLNAME=`echo $LINE | sed 's/[ ]\+//' | cut -d " " -f 5 | cut -d "=" -f 2 | sed 's/"//g'`
		echo -e "BEGIN:VCARD\nVERSION:3.0" >> abook.vcf
		echo "UID:$PUID" >> abook.vcf
	else
		EXSTAT=`echo $LINE | grep -q "address uid" ; echo $?`
		if [ "$EXSTAT" -eq "0" ]; then
			AEML=`echo $LINE | sed 's/[ ]\+//' | cut -d " " -f 3 | cut -d "=" -f 2 | sed 's/"//g'`
			echo "EMAIL:$AEML" >> abook.vcf
			echo "FN:$FULLNAME" >> abook.vcf
				if [ "$LASTNAME" = "" ]; then
					echo "N:$FIRSTNAME;$FULLNAME;;;" >> abook.vcf
				else
					echo "N:$FIRSTNAME;$LASTNAME;;;" >> abook.vcf
				fi
			echo "END:VCARD" >> abook.vcf
		fi
	fi
done <$1

Как пользоваться, наверное знаешь: скопировать код в файл, например cmd.sh, сделать его исполняемым, затем в терминале запустить его ./cmd.sh addrbook*.xml, выхлоп будет в файле abook.vcf

foxy_ant ★★
()