Миграция данных эволюции (при обновлении) пропустила все, кроме первых & ldquo; accounts & rdquo; (почта, адресная книга, календарь & hellip;)

Проблема в ssl, она не имеет ничего общего с HTTP, поэтому зачем исправлять httplib, если вы можете исправить ssl. Следующий код должен исправить все SSL-сокеты, включая, но не ограничиваясь HTTPS, для Python 2.6+ (встроенный в ssl, не пытался с pyopenssl).

import functools
import ssl

old_init = ssl.SSLSocket.__init__

@functools.wraps(old_init)
def ubuntu_openssl_bug_965371(self, *args, **kwargs):
  kwargs['ssl_version'] = ssl.PROTOCOL_TLSv1
  old_init(self, *args, **kwargs)

ssl.SSLSocket.__init__ = ubuntu_openssl_bug_965371
0
задан 11 June 2012 в 05:55

15 ответов

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 25 July 2018 в 18:39

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 2 August 2018 в 00:48

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 4 August 2018 в 16:18

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 6 August 2018 в 00:57

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 7 August 2018 в 18:23

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 10 August 2018 в 07:06

Копаясь немного глубже, я понял две вещи: в то время как новый формат базы данных - SQLite3, старым был некоторый двоичный файл VCARD, где он читается. Итак, я придумал небольшой фрагмент 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% отлично, но лучше, чем потерять все эти данные. Скрипт проходит через базу данных старого стиля и пытается извлечь все хранящиеся там VCARD. Они экспортируются в отдельные файлы (каждый VCARD в один файл, если $ separate_vcards = TRUE) или в одну коллекцию (в противном случае).

Так как предполагается, что это файлы в текстовом формате, можно проверить их и легко их исправить (разрывы строк, двоичный мусор) - и, наконец, используя Evolutions Import-Feature (найти в меню «Файл»), чтобы импортировать данные («один файл») в существующую адресную книгу (создать пустой раньше, если вы хотите новую адресную книгу).

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

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

0
ответ дан 15 August 2018 в 19:05
  • 1
    – user148621 12 April 2013 в 00:19
  • 2
    – octoquad 15 May 2018 в 21:32
  • 3
    У меня было не так много контактов, поэтому мое соотношение было лучше. Давным-давно, правда, у вас действительно была такая старая установка (pre-12.04), которая работает еще? Но рад отметить, что у другого (Python) подхода были лучшие результаты для вас! – Izzy 16 May 2018 в 01:16
  • 4
    Да, мне пришлось перейти от Evolution 2.28 от тонких клиентов Ubuntu 10.04 (LTSP) к жирным клиентам, которые теперь запускают Ubuntu 18.04 с Evolution 3.28. – octoquad 23 May 2018 в 19:45

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 25 May 2018 в 10:37
  • 1
    Если вы отсортируете повторяющиеся почтовые адреса: знает ли ваш сценарий «списки»? Можно было бы: a) несколько списков с перекрывающимися участниками или б) иметь полные записи людей, которые являются частью списков. Просто замечание, так как это может не повлиять на всех :) Кроме того: Спасибо, что поделились своим решением! – Izzy 8 July 2013 в 00:26
  • 2
    Это работает очень хорошо. У меня было несколько контактов, которые попали в плохой текстовый файл (~ 1-3%) из более чем 2000 адресов. Этот скрипт работает хорошо, если вы переходите с Evolution 2.28 до 3.28. – octoquad 15 May 2018 в 21:30

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 25 July 2018 в 18:39

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 2 August 2018 в 00:48

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 4 August 2018 в 16:18

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 6 August 2018 в 00:57

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 7 August 2018 в 18:23

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 10 August 2018 в 07:06

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

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

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

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

После того, как вы закончите преобразование, вы можете проверить «плохой» выходной файл и посмотреть, есть ли там что-то, что отсутствует в выходном файле .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
ответ дан 15 August 2018 в 19:05
  • 1
  • 2
    Это работает очень хорошо. У меня было несколько контактов, которые попали в плохой текстовый файл (~ 1-3%) из более чем 2000 адресов. Этот скрипт работает хорошо, если вы переходите с Evolution 2.28 до 3.28. – octoquad 15 May 2018 в 21:30

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

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