Заранее прошу прощения, если название покажется немного неправильным. Мне было трудно решить, как именно я должен назвать это. В любом случае, в основном то, что я делаю сейчас, — это полностью домашняя работа, связанная с низкоуровневыми операциями ввода-вывода. Для моего одного задания я дал два файла .txt, один из которых содержит список адресов электронной почты, а другой включает список участников, которые больше не должны были быть в списке электронной почты. Что мне нужно сделать, так это удалить электронные письма участников из второго списка. Кроме того, в файлах .txt могут быть неприятные сюрпризы. Я должен очистить электронные письма и удалить все нежелательные знаки препинания после электронных писем, такие как точки с запятой, запятые и пробелы. Кроме того, мне нужно перевести весь текст в нижний регистр. Я борюсь с этой проблемой несколькими способами (я не совсем уверен, как заставить мой файл писать то, что мне нужно, в моем выводе), но сейчас моя главная задача - вывести сообщение об отказе от подписки в правильном заказ. Сортировка, похоже, не работает.
Вот несколько тестовых случаев:
Test Cases
unsubscribe('Grand Prix Mailing List.txt', ...
'Unsubscribe from Grand Prix.txt')
=> output file named 'Grand Prix Mailing List_updated.txt' that looks
like 'Grand Prix Mailing List_updated_soln.txt'
=> output file named 'Unsubscribe from Grand Prix_messages.txt' that
looks like 'Unsubscribe from Grand Prix_messages_soln.txt'
Оригинальный список рассылки
Grand Prix Mailing List:
[email protected],
[email protected]
[email protected];
[email protected]
[email protected],
[email protected]
[email protected]
[email protected];
[email protected]
[email protected]
[email protected]
Люди, которые как нет:
MARIO PLUMBER;
bowser koopa
Luigi Plumber,
Donkey Kong
King BOO;
Princess Peach
Как это должно выглядеть после:
[email protected]
[email protected]
[email protected]
[email protected]
[email protected]
Мой вывод файла:
Mario, you have been unsubscribed from the Grand Prix mailing list.
Luigi, you have been unsubscribed from the Grand Prix mailing list.
Bowser, you have been unsubscribed from the Grand Prix mailing list.
Princess, you have been unsubscribed from the Grand Prix mailing list.
King, you have been unsubscribed from the Grand Prix mailing list.
Donkey, you have been unsubscribed from the Grand Prix mailing list.
Итак, Amro был достаточно любезен, чтобы предоставить решение, хотя оно немного превосходит то, что я знаю прямо сейчас. Моя главная проблема сейчас заключается в том, что когда я вывожу сообщение об отмене подписки, мне нужно, чтобы оно было в том же порядке, что и исходный список адресов электронной почты. Например, хотя Баузер был в списке жалоб перед Луиджи, в сообщении об отказе от подписки Луиджи должен появиться перед ним.
Вот мой исходный код:
function[] = unsubscribe(email_ids, member_emails)
Old_list = fopen(email_ids, 'r'); %// opens my email list
Old_Members = fopen(member_emails, 'r'); %// Opens up the names of people who want to unsubscribe
emails = fgets(Old_list); %// Reads first line of emails
member_emails = [member_emails]; %// Creates an array to populate
while ischar(emails) %// Starts my while loop
%// Pulls out a line in the email
emails = fgets(Old_list);
%// Quits when it sees this jerk
if emails == -1
break;
end
%// I go in to clean stuff up here, but it doesn't do any of it. It's still in the while loop though, so I am not sure where the error is
proper_emails = lower(member_emails); %// This is supposed to lowercase the emails, but it's not working
unwanted = findstr(member_emails, ' ,;');
member_emails(unwanted) = '';
member_emails = [member_emails, emails];
end
while ischar(Old_Members) %// Does the same for the members who want to unsubscribe
names = fgetl(member_emails);
if emails == -1
break
end
proper_emails = lower(names); %// Lowercases everything
unwanted = findstr(names, ' ,;');
names(unwanted) = '';
end
Complainers = find(emails);
New_List = fopen('Test2', 'w'); %// Creates a file to be written to
fprintf(New_List, '%s', member_emails); %// Writes to it
Sorry_Message = fopen('Test.txt', 'w');
fprintf(Sorry_Message, '%s', Complainers);
%// Had an issue with these, so I commented them out temporarily
%// fclose(New_List);
%// fclose(Sorry_Message);
%// fclose(email_ids);
%// fclose(members);
end
regexp
или регулярные выражения — это те вещи, которые вы действительно хотите изучить. Они могут быть очень полезны при работе с текстом в полусвободной форме. В Интернете есть хороший учебник: regexone.com. Строка, которую вы выделили, строит адрес электронной почты из имени/фамилии: я извлекаю первую букву из имени, затем добавляю фамилию и доменную часть.strcat
может обрабатывать смешанный ввод как с массивами ячеек, так и с обычными символами. Я предлагаю вам запустить код в отладчике и выполнять его построчно, проверяя переменные на каждом этапе. 14.10.2014fileparts
— это функция, используемая для разделения пути/имени/расширения полного имени файла. Таким образом, при вводе типаC:\path\to\file.txt
он будет разделять его наC:\path\to
как путь,file
как имя и.txt
как расширение. Я использовал эту функцию, чтобы получить исходное имя файла списка рассылки и добавить к нему часть_updated
. 14.10.2014regexone
. Пришло время освежить мойregex
, так как многие вопросы здесь могут быть красноречиво решены с его помощью. 14.10.2014firstName LastName
(плюс любые знаки препинания в конце), по одному на строку. Если это так, вам придется настроить регулярное выражение, чтобы оно соответствовало всем возможным случаям... Помимо того, что используемое здесь регулярное выражение действительно простое, вы можете заменить его чем-то другим; идея состоит в том, чтобы разбить строку на части имени и фамилии, разделенные пробелами (обратите внимание, что я применяю ее к массиву ячеек строк, поэтому вам придется иметь дело с этим циклом, если вам нужно) 14.10.2014Grand Prix Mailing List:
). Это тоже часть файла? 14.10.2014first_last
должен быть массивом ячеек Nx2 строк, где 1-й столбец — это имена, а 2-й столбец содержит фамилии). 14.10.2014