2008-11-09 2 views
2

У меня есть 3 текстовых файла (A, B и C), каждый из которых содержит несколько сотен адресов электронной почты. Я хочу объединить список A и список B в один файл, игнорируя различия в случайном и белом пространстве. Затем я хочу удалить все электронные письма в новом списке, которые находятся в списке C, снова игнорируя различия в случайном и белом пространстве.Лучший способ обработки списков адресов электронной почты

Мой язык программирования, как правило, C++, но, похоже, он плохо подходит для этой задачи. Есть ли язык сценариев, который мог бы сделать это (и подобные задачи) в относительно немногих строках?

Или есть программное обеспечение уже там (бесплатное или коммерческое), которое позволит мне это сделать? Можно ли это сделать в Excel, например?

ответ

3

Самый быстрый способ сделать это, вероятно, не обязательно требует кодирования. Вы можете импортировать файлы A и B в Excel на одном листе, а затем (при необходимости) сделать фильтр в этом результирующем списке адресов для удаления любых дубликатов.

Следующим шагом будет импорт файла C во второй рабочий лист. На третьем листе вы сделаете VLOOKUP, чтобы выбрать все адреса в своем первом списке и удалить их, если они находятся в вашем «списке C».

ВПР будет выглядеть примерно так:

= ЕСЛИ (ЕНД (ВПР (email_address_cell, Лист2 email_duplicates_list, 1, ложь), "", (ВПР (email_address_cell, Лист2 ! email_duplicates_list, 1, ложь)))

Я также включал проверку, чтобы увидеть, если формула возвращает значение «Value Not Available» ошибка, в этом случае клетка просто показывает пустой Вэл уе. Оттуда вам просто нужно удалить пустое пространство, и есть ваш окончательный список.

Теперь, сказав все это, вы все равно можете сделать макрос VBA, чтобы сделать то же самое, но, возможно, немного очистите списки, в зависимости от того, что вам нужно. Надеюсь, это поможет!

+0

Как это касается требований к пробелам и случаям. – paxdiablo 2008-11-10 04:40:36

2

Для обработки текста, которую вы описываете, идеально подходят perl или python.

Вы можете использовать ассоциативные массивы (массивы со строковым индексом в этом случае) для хранения адресов электронной почты в списке.

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

Затем необходимо прочитать и сохранить первый файл, прочитать и сохранить второй (который будет перезаписывать адреса электронной почты одним и тем же ключом), затем читать в третьем файле и удалять записи из списка с помощью этого ключа ,

То, что у вас осталось, это список, который вы хотите (A + B - C).

Псевдо-код здесь:

set list to empty 
foreach line in file one: 
    key = unwhitespace(tolowercase(line)) 
    list{key} = line 
foreach line in file two: 
    key = unwhitespace(tolowercase(line)) 
    list{key} = line 
foreach line in file three: 
    key = unwhitespace(tolowercase(line)) 
    if exists(list{key}) 
     delete list{key} 
foreach key in list: 
    print list{key} 
0

Excel может сделать это, как указано выше. Наиболее подходящим языком программирования является Perl.

1

В Python, что-то вроде этого:

Заметим, что это будет писать строчные письма на конечную продукцию. Если это не так, то вам понадобится решение на основе словаря.

def read_file(filename): 
    with file(filename, "r") as f: 
     while True: 
      line = f.readline(); 
      if not line: 
       break; 
      line = line.rstrip(); 
      if line: 
       yield line; 

def write_file(filename, lines): 
    with file(filename, "w") as f: 
     for line in lines: 
      f.write(line + "\n"); 

set_a = set((line.lower() for line in read_file("file_a.txt"))); 
set_b = set((line.lower() for line in read_file("file_b.txt"))); 
set_c = set((line.lower() for line in read_file("file_c.txt"))); 

# Calculate (a + b) - c 
write_file("result.txt", set_a.union(set_b).difference(set_c)); 
2

Как упоминалось в Excel, вы также можете делать подобные вещи с помощью Jet и VBScript.

Set cn = CreateObject("ADODB.Connection") 
strCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\Docs\;" _ 
& "Extended Properties=""text;HDR=No;FMT=Delimited"";" 

cn.Open strCon 

strSQL = "SELECT F1 Into New.txt From EmailsA.txt " _ 
    & "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)" 
cn.Execute strSQL 

strSQL = "INSERT INTO New.txt (F1) SELECT F1 FROM EmailsB.txt " _ 
    & "WHERE UCase(F1) Not IN (SELECT UCase(F1) From EmailsC.txt)" 
cn.Execute strSQL 
1

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

1

К сожалению, этот ответ, вероятно, не поможет, но если на самом деле вы используете Unix (Linux, например), вы могли бы сделать что-то вроде:

кошачьей FiLea >> FILEB # добавить файл в файл б

sort fileb | uniq> newFile # newFile теперь содержит слияние файлов a и файла b со отсортированными и уникальными адресами электронной почты

Выше все может быть сделано на одной строке следующим образом: cat filea >> fileb | сортировать | uniq> newFile

Теперь у вас осталось просто удалить общие электронные письма. Некоторые вариации «дифф» должны быть полезными там, такими как, возможно: дифф NewFile fileC> finalFile

дифф даст вам список различий между двумя файлами, поэтому выход в «finalFile» должен быть списком электронные письма, которые находятся в «newFile» (слияние A & B), но НЕ находятся в файлеC. Параметры для различных инструментов позволяют игнорировать пробелы и случай. Мне пришлось бы поиграть с ним немного, чтобы понять это правильно, но это общая идея.

Раньше у меня был дополнительный ящик, работающий под управлением Linux, с единственной целью - делать такие вещи, как выше, что представляет собой хлопот под Windoze, но легкий бриз под операционными системами Unix. Когда мое оборудование умерло, я никогда не собирался строить еще один Linux-блок.

Я считаю, что набор инструментов MKS для Windoze, вероятно, имеет все перечисленные выше утилиты.

Смежные вопросы