Найти имя в электронном письме (низкоуровневый ввод / вывод)

Раунд 2: Выделение лидеров в электронном письме Хорошо, поэтому моя следующая проблема - попытаться выяснить, кто является лидером в проекте. Чтобы определить это, нам дают электронное письмо, и мы должны найти, кто говорит "Хотите ли вы..." (заглавные буквы могут отличаться). Я чувствую, что мой код должен работать по большей части, но у меня действительно есть проблема, выясняющая, как правильно заполнить мой массив ячеек. Я могу получить его для создания массива ячеек, но он просто помещает в него письмо снова и снова. Так что каждая ячейка - это, в основном, имя.

function[Leader_Name] = teamPowerHolder(email)

email = fopen(email, 'r'); %// Opens my file
lines = fgets(email); %// Reads the first line

conversations = {lines}; %// Creates my cell array


while ischar(lines) %// Populates my cell array, just not correct
    Convo = fgets(email);
    if Convo == -1 %// Prevents it from just logging -1 into my cell array like a jerk
        break; %// Returns to function
    end
    conversations = [conversations {lines}]; %// Populates my list
end
Sentences = strfind(conversations,'Do you want'); %// Locates the leader position


Leader_Name = Sentences{1}; %// Indexes that position

fclose(email);
end

В идеале мне нужно найти символ '/n' (поэтому я и использовал fgets), но я не уверен, как заставить его это делать. Я пытался сделать так, чтобы цикл while был таким:

while lines == '/n'

но это неверно Я чувствую, что знаю, как сделать бит '/n', я просто не могу об этом думать. Так что я буду признателен за некоторые советы или подсказки, чтобы сделать это. Я всегда мог попытаться strsplit или strtok функции, но мне нужно заполнить массив ячеек, чтобы он мог запутаться.

Пожалуйста и спасибо за помощь:)

Test Case:
Anna: Hey guys, so I know that he just assigned this project, but I want to go ahead   and get started on it.
Can you guys please respond and let me know a weekly meeting time that will work for you?

Wiley: Ummmmm no because ain't nobody got time for that.

John: Wiley? What kind of a name is that? .-.

Wiley: It's better than john. >.>

Anna: Hey boys, let's grow up and talk about a meeting time.
Do you want to have a weekly meeting, or not?

Wiley: I'll just skip all of them and not end up doing anything for the project anyway.
So I really don't care so much.

John: Yes, Anna, I'd like to have a weekly meeting.
Thank you for actually being a good teammate and doing this. :)

out2 = teamPowerHolder('teamPowerHolder_convo2.txt')
    => 'Anna'

1 ответ

Решение

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


Тем не менее, я бы посоветовал вам прочитать в каждой строке, а затем найти : символа, затем извлекайте строку до тех пор, пока вы в первый раз не встретите этот символ минус 1, потому что вы не хотите включать фактический : сам персонаж. Скорее всего, это будет соответствовать имени человека, который говорит. Если мы пропустили этот случай, то этот человек все еще говорит. Таким образом, вам придется хранить переменную, которая отслеживает, кто еще говорит в данный момент, пока вы не найдете строку "Вы хотите". Кто бы ни сказал это, мы возвращаем человека, который сейчас говорит, вырвавшись из цикла, конечно! Чтобы строка не чувствительна к регистру, вам нужно преобразовать строку в более низкую.

Возможен случай, когда лидер не найден. В этом случае вы, вероятно, захотите вернуть пустую строку. Как таковой, инициализируйте Leader_Name в пустую строку. В этом случае это будет [], Таким образом, если мы пройдем по электронной почте и не найдем лидера, MATLAB вернется [],

У вас есть правильная логика, но я бы даже не стал хранить вещи в массиве ячеек. Просто изучите каждую строку в вашем текстовом файле и следите за тем, кто говорит в данный момент, пока мы не встретим предложение с другим : персонаж. Мы можем использовать strfind чтобы облегчить это. Тем не менее, я хочу упомянуть одну небольшую оговорку: если говорящий : в их разговоре, тогда этот метод сломается.

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

function[Leader_Name] = teamPowerHolder(email)

Leader_Name = []; %// Initialize leader name to empty
name = [];    

email = fopen(email, 'r'); %// Opens my file
lines = fgets(email); %// Reads the first line

while ischar(lines)

    % // Get a line in your e-mail
    lines = fgets(email);

    % // Quit like a boss if you see a -1
    if lines == -1
        break;
    end

    % // Check if this line has a ':' character.
    % // If we do, then another person is talking.
    % // Extract the characters just before the first ':' character
    % // as we don't want the ':' character in the name
    % // If we don't encounter a ':' character, then the same person is
    % // talking so don't change the current name
    idxs = strfind(lines, ':');
    if ~isempty(idxs)
        name = lines(1:idxs(1)-1);
    end    

    % // If we find "do you want" in this sentence, then the leader
    % // is found, so quit.
    if ~isempty(strfind(lower(lines), 'do you want'))
        Leader_Name = name;
        break;
    end
end

Запустив приведенный выше код в вашем тестовом примере, я получу следующее:

out2 = teamPowerHolder('teamPowerHolder_convo2.txt')

out2 = 

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