2015-02-05 61 views
0

我有以下格式的文件:Textscan Matlab;不讀格式

**400**,**100**::400,descendsFrom,**76**::0 
**400**,**119**::400,descendsFrom,**35**::0 
**400**,**4**::400,descendsFrom,**45**::0 
... 
... 

現在我需要閱讀的部分僅在大膽。我寫了以下格式:

formatspec = '%d,%d::%*d,%*s,%d::%*d\n'; 
data = textscan(fileID, formatspec); 

它似乎沒有工作。有人能告訴我什麼是錯的嗎? 我還需要知道如何'不使用'分隔符,以及如果我想表達我的文件寫入的確切方式,例如在上面的情況下如何繼續。

+2

的矩陣你是不是想將代碼塊與Markdown樣式格式混合使文本變爲粗體?雙星號是否在你的文件中?如果他們不是,編輯您的問題以刪除它們 - 代碼塊格式完全一樣。你需要用文字來描述你想要的元素。 – horchler 2015-02-05 16:44:36

回答

0

EDITED

一個可能的問題是與formatspec變量%s零件。因爲%s是一個任意的字符串,所以這個行的一部分被排序爲這個字符串。因此,使用formatpec'%d,%d ::%d,%s,%d ::%d \ n'您將從第一行獲得以下單元格:

400 100 400'descendsFrom, 76 :: 0'

爲了解決這個問題,你有兩種可能性:

formatspec = %d,%d::%d,descendsFrom,%d::%d\n 

OR

formatspec = %d,%d::%d,%12s,%d::%d\n 

在第一種情況下 'descendForm' 字符串必須由每一行包含(如你的例子)。在第二種情況下,字符串可以更改,但其長度必須爲12.

+0

*在文本掃描格式表明一個字段應該被跳過,它們不是多餘的。 – nkjt 2015-02-05 19:07:07

+0

你是對的我編輯了我的答案。 – 2015-02-05 19:18:55

0

你的分隔符是「,」你應該先分隔它,然後運行一個正則表達式。這是我會怎麼做呢:

fileID = fopen('file.csv'); 
D = textscan(fileID,'%s %s %s %s ','Delimiter',','); %read everything as strings 

column1 = regexprep(D{1},'*','') 
column2 = regexprep(D{2},{'*',':'},{'',''}) 
column3 = D{3} 
column4 = regexprep(D{4},{'*',':'},{'',''}) 

這應該產生的4列,然後可以結合 相信定界符只能是一個符號。更有效的方式是直接做regexprep你的整條生產線,這將產生:

test = '**400**,**4**::400,descendsFrom,**45**::0' 
test = regexprep(test,{'*',':'},{'',''}) 

>> test = 400,4400,descendsFrom,450 
+0

感謝您的回答。 是的,我的意思是我總是可以將所有內容放入一個字符串中,然後分開,但我需要知道'如何正確指定格式'。在這種情況下,也許沒關係,有一個','分隔符,但如果沒有一個分隔符,並且我有如下文件: 400,100 :: 400; descendsFrom:76 :: 0 然後我想知道如何正確指定格式,以及爲什麼我寫的不起作用。 – Prateek 2015-02-05 16:48:21

+0

嗯,我不認爲你可以在textscan中做你的多分隔符,如果你想使用textscan,你可以在你的字符串上做一個sprintf(使用你的格式化代碼),但是我不知道如何指定多個特定的分隔符textscan ... – GameOfThrows 2015-02-05 16:52:54

+0

祝福你格式化你的代碼。現在你的帖子看起來不錯。 – rayryeng 2015-02-05 16:58:08

0

您可以在textscan中執行多個分隔符,它們需要作爲字符串的單元數組提供。您不需要格式中的行尾字符,並且您需要設置'MultipleDelimsAsOne'。不用MATLAB來的手,但這些方針的東西應該工作:

formatspec = '%d %d %*d %*s %d %*d'; 
data = textscan(fileID, formatspec,'Delimiter',{',',':'},'MultipleDelimsAsOne',1); 

如果你想將它作爲返回數字不是一個單元陣列,也嘗試添加選項'CollectOutput',1