2014-10-10 60 views
0

第2輪:挑選電子郵件中的領導 好吧,所以我的下一個問題是要弄清楚領導是誰在項目中。爲了確定這一點,我們收到一封電子郵件,並且必須找到誰說「你想要......」(大小寫可能會有所不同)。我覺得我的代碼應該適用於大多數情況,但我真的有一個問題想出如何正確填充我的單元陣列。我可以通過它來創建單元陣列,但它只是將電子郵件重新放入。所以每個單元基本上都是這個名字。在電子郵件中查找名稱(低級別I/O)

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' 
+0

你忘了包括MATLAB標籤。對你的帖子做了一個小小的修改。 – rayryeng 2014-10-11 15:49:46

+0

糟糕。這可能是最重要的部分。 – 2014-10-11 17:37:36

回答

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 
+0

我希望我有你的大腦。這非常合理。我忘了〜isempty函數。我想我可以找到它,然後...做一些非常複雜的東西與換行符和什麼。 – 2014-10-11 17:51:47

+1

@JessicaMarie - ahaha謝謝:)它誠實地只需要練習。要相當擅長編程,你只需要不斷練習並尋求幫助。另外,我很高興這很有意義:)! 'isempty'非常有用......當你編程時,你將學習許多其他有用的功能。關於這種方法,這是對我有意義的方法。我所做的只是把你的要求,並以我能夠以最自然的方式進行編碼。 – rayryeng 2014-10-11 21:40:42

相關問題