При переносе данных Evolution (при обновлении) пропущены все, кроме первых & ldquo; учетных записей & rdquo; (почта, адресная книга, календарь & hellip;)

Из-за сбоя системы мне пришлось сделать новую установку на новый компьютер. К счастью, мой жесткий диск не был затронут, но, к сожалению, «старый добрый 8.04» не захотел загружаться с него в новой системе ...

Итак, установив 12.04 на новый жесткий диск, я скопировал все папки эволюции со старого диска в соответствующие места (~ / .evolution plus ~ / .gconf / apps / evolution - старый Evo 8.04 не имел ~ / .local / share / evolution) и запустил приложение. Выскочил помощник по миграции, и я прошел - но в итоге только одна из моих «учетных записей» в каждой категории была перенесена и доступна: локальная почта, одна из 4 учетных записей IMAP (хотя данные всех 4 учетных записей были перемещены ~ / .local / share / evolution), одна из 4 адресных книг и т. д.

Не имеет большого значения для IMAP, так как мне просто нужно было его настроить (в этом случае данные хранятся на сервере). Но как мне вернуть мои адресные книги? Как описано выше, запуск «старой установки» для экспорта этих данных не возможен, так как старая система больше не может быть запущена. Есть ли способ запустить помощник по миграции для заданного набора данных (в моем случае: сказать ему просто перенести и импортировать одну указанную адресную книгу)?

0
задан 11 June 2012 в 04:55

2 ответа

Закапывая немного глубже, я изобразил две вещи: В то время как новый формат базы данных является SQLite3, старым был некоторый двоичный файл, хранящий VCARDs который, где явно читаемый. Таким образом, я придумал маленький отрывок PHP:

#!/usr/bin/php
<?php
# -=[ UserConf ]=-
$evodb = 'addressbook.db'; // (path and) name to the old address database
$name  = 'business';       // name of the address book (used as filename)
$separate_vcards = FALSE;  // if TRUE, each VCARD will go to a separate file

#-=[ Do not touch below lines ]=-
$re_vcard = '!(BEGIN:VCARD.*?END:VCARD)!ims';

$evo = file_get_contents($evodb);
preg_match_all($re_vcard,$evo,$vcards);
$cards = count($vcards[1]);
$new = '';
for ($i=0;$i<$cards;++$i) {
  if ($separate_vcards) {
    file_put_contents("${name}_${i}.vcf",$vcards[1][$i]);
  } else {
    $new .= $vcards[1][$i] . "\n\n";
  }
}
if (!$separate_vcards) file_put_contents("${name}.vcf",$new);
?>

Это не на 100% прекрасно, но лучше, чем потеря всех тех данных. Сценарий пробегает базу данных старого стиля и пытается выбрать весь VCARDs, сохраненный там. Они или экспортируются для разделения файлов (каждый VCARD в одном файле, если $separate_vcards = TRUE), или к одному набору (иначе).

Поскольку они, как предполагается, являются файлами простого текста, можно проверить их и исправить их легко (разрывы строки, двоичный мусор) - и наконец использование Функции Импорта Эволюций (найденный в меню "File") для импорта данных ("единственный файл") в существующий addressbook (создайте пустой прежде, если Вы хотите новый addressbook).

Для меня это восстановило приблизительно 90% моих прекрасных адресов. Для остающихся 10% некоторые, где запутавшийся или поврежденный (помнят, даже старый формат был двоичным - и отрывок просто, работают в "режиме ASCII").

Надежда это помогает кому-то еще (если так, не забывайте-голосовать за это решение).

0
ответ дан 11 June 2012 в 04:55

Вышеупомянутая PHP запустила меня. Но у меня были проблемы со спамом в картах.

Я - парень Python, таким образом, я записал новую программу в Python. Я использовал Python 2.x для выполнения этого.

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

Я думаю, что двоичный спам между картами использовался Эволюцией для выяснения, какие карты были допустимы. Эта программа просто использует несколько эмпирических правил: если карта имеет двоичные символы мусора в ней, или правильно не завершается или не имеет адреса электронной почты в ней, это - плохая карта и входит в "плохой" выходной файл.

После того, как Вы сделаны, преобразовав, можно проверить "плохой" выходной файл и видеть, существует ли что-нибудь там, которое не находится в .vcf выходном файле. В моем случае, не был; эта программа получила все хорошие карты для меня.

#!/usr/bin/python

import re
import sys

def bad_chars():
    for n in range(0, 32):
        if n not in (9, 10, 13):
            yield chr(n)
    for n in range(128, 256):
        yield chr(n)

def has_bad(s):
    return any(ch in s for ch in bad_chars())

def get_email(card):
    lst = card.split('\n')
    for line in lst:
        if "EMAIL" in line:
            _, _, email = line.partition(':')
            return email.strip()
    else:
        return ''

if len(sys.argv) != 4:
    print("Usage: cvt.py <input_old_address_book> <output.vcf> <bad.txt>")
    sys.exit(1)


with open(sys.argv[1], "rb") as in_f:
    s = in_f.read()

s_start = "BEGIN:VCARD"
s_end = "END:VCARD"

cards = {}
lst_bad = []

while s:
    i_start = s.find(s_start)
    if i_start == -1:
        break

    i_next = s.find(s_start, i_start + len(s_start))
    if i_next == -1:
        i_next = len(s) - 1

    i_end = s.find(s_end, i_start + len(s_start))
    if i_end == -1:
        i_end = len(s) - 1
    else:
        i_end += len(s_end)

    if i_next < i_end:
        i_end = i_next

    card = s[i_start:i_end+1].strip()
    s = s[i_end:]

    card = card.replace('\r', '')
    card = card.replace('\0', '')
    if not card:
        continue

    key = get_email(card)
    if has_bad(card) or s_end not in card or not key:
        lst_bad.append(card)
        continue

    if key not in cards or len(card) > len(cards[key]):
        cards[key] = card

with open(sys.argv[2], "w") as out_f:
    for key in sorted(cards.keys()):
        out_f.write(cards[key] + "\n\n")

with open(sys.argv[3], "w") as bad_f:
    for s in lst_bad:
        bad_f.write(s + "\n\n")
1
ответ дан 11 June 2012 в 04:55

Другие вопросы по тегам:

Похожие вопросы: