2012-01-10 29 views
3

我想檢索文本文件中的字符串的特定部分,如下面,我想將它們保存在文本文件中MATLAB從文本文件中檢索字符串的特定部分,並將其保存在一個新的文件在MATLAB中

原始文本文件

D 1m8ea_ 1m8e A: d.174.1.1 74583 cl=53931,cf=56511,sf=56512,fa=56513,dm=56514,sp=56515,px=74583 
D 1m8eb_ 1m8e B: d.174.1.1 74584 cl=53931,cf=56511,sf=56512,fa=56513,dm=56514,sp=56515,px=74584 
D 3e7ia1 3e7i A:77-496 d.174.1.1 158052 cl=53931,cf=56511,sf=56512,fa=56513,dm=56514,sp=56515,px=158052 
D 3e7ib1 3e7i B:77-496 d.174.1.1 158053 cl=53931,cf=56511,sf=56512,fa=56513,dm=56514,sp=56515,px=158053 
D 2bhja1 2bhj A:77-497 d.174.1.1 128533 cl=53931,cf=56511,sf=56512,fa=56513,dm=56514,sp=56515,px=128533 

所以基本上,我想找回這些被標記爲"1m8e"的pdbcodes ID,chainid打成"A"開始值是"77"和停止值是"496"我希望將所有這些值保存在fprintf中tatment。

是否有某種方法是我可以在RegExp中使用,說明哪個索引的所有開始和檢索這些字符串基於文本文件中每個行的位置?

最後,我想要在fprinf語句中有1m8e, A, 77, 496

到目前爲止,我有兩個fopen功能,讀取文件和一個寫入到一個新的文件,並讀取行的每一行,也有fprintf statment:

pdbcode = ''; 
chainid = ''; 
start = ''; 
stop = ''; 
fin = fopen('dir.cla.scop.txt_1.75.txt', 'r'); 
fout = fopen('output_scop.txt', 'w'); 
% TODO: Add error check! 
while true 
    line = fgetl(fin); % Get the next line from the file 
    if ~ischar(line) 
     % End of file 
     break; 
    end 

      % Print result into output_cath.txt file 

      fprintf(fout, 'INSERT INTO cath_domains (scop_pdbcode, scop_chainid, scopbegin, scopend) VALUES("%s", %s, %s, %s);\n', pdbcode, chainid, start, stop); 

謝謝。

回答

1

你應該能夠在空白處得到strsplit,得到第三個(「1m8e」)和第四個元素(「A:77-496」),然後用「:」作爲分割字符在第四個元素上重複該過程,然後再用這兩個參數中的第二個用「 - 」作爲分割字符。這是一種方法。例如,你可以這樣做:

% split on space and tab, and ignore empty tokens 
tokens = strsplit(line, ' \t', true); 
pdbcode = tokens(3); 
% split fourth token from previous split on colon 
tokens = strsplit(tokens(4), ':'); 
chainid = tokens(1); 
% split second token from previous split on dash 
tokens = strsplit(tokens(2), '-'); 
start = tokens(1); 
stop = tokens(2); 

如果你真的想使用regular expressions,你可以嘗試以下

pattern = '\S+\s+\S+\s+(\S+)\s+([A-Za-z]+):([0-9]+)-([0-9]+)'; 
[mat tok] = regexp(line, pattern, 'match', 'tokens'); 
pdbcode = cell2mat(tok)(1); 
chainid = cell2mat(tok)(2); 
start = cell2mat(tok)(3); 
stop = cell2mat(tok)(4); 
+0

,如果我想用分裂,不要我需要定義名稱的文本文件,例如:split('_ /','fin')',其中'fin'代表我打開的文件? 此外,我嘗試使用上述方法與正則表達式,它不工作。它會打印出空白字符串。請指教。 – Jeiman 2012-01-10 23:45:45

+0

錯誤使用拆分功能:'???對'char'類型的輸入參數未定義的函數或方法'split'。請指出。 – Jeiman 2012-01-11 00:19:34

+1

對不起。顯然,拆分已被棄用。我會相應地更新我的答案。 – 2012-01-11 02:34:36

相關問題