2016-08-16 21 views
0

私はMATLABを使用して出力ファイルを読み込み、同じファイルに対してPythonで書いた読者と比較してかなりゆっくりとファイルを読み込んでいたことに気づきました。 MATLABの場合は120秒、Pythonの場合は4秒です)。ファイルには文字と数字の組み合わせがありますが、実際にはそれぞれ同じ行に一意の文字列が必要ですが、残りのファイルには実際のパターンはありません。非一様にフォーマットされたテキストファイルをMATLABで高速に読み取る方法はありますか?MATLABでの高速文字列分割

私はMATLABのコードプロファイラを使って何が最も時間がかかるか調べてみましたが、それはstrfindstrsplitの機能のようでした。深く下に行くと、strfun\private\strescapestrsplit機能によって呼び出される時間の約50%を占める犯人のようです。

私は現在、5つの特定の文字列のファイルを検索し、その後にその文字列をダブルに変換するためにstrfindとstrsplitの組み合わせを使用しています。

lots of text before this 

    #### unique identifying text here 

lots of text before this 

sometext X = ##### 
      Y = ##### 
      Z = ##### 
more text = ###### 

私は、見つかった各番号に対して、およそ次のコードでファイルを繰り返しています。

fid=fopen(filename) 
tline=fgets(fid) 
while ischar(tline) 
    if ~isempty(strfind(tline('X ='))) 
     tempstring=strsplit(tline(13:length(tline)),' '); 
     result=str2double(char(tempstring(2))); 
    end 
    tline=fgets(fid); 
end 
+0

'strsplit'はセル配列を返します。セル配列も非常に遅いです。そして、私は、いくつかの文字列操作関数は、オーバーヘッドの束を持っていると信じています。 'textscan'を使ってみましたか?それとももっと良いのですか?あなたのpythonスクリプトは?:) –

+0

あなたの方法は一般的には非効率的だと思われますが、実際のファイルを使わずにパフォーマンスを "比較"することはあまりありません。リンクできるコピーがありますか? –

+0

また、私はあなたが基本的にX YとZの値を求めていると考えて正しいですか? –

答えて

2

私はこれが少し速くなると思っていますが、それほど多分ではありません。

s = fileread('texto'); 
[X,s] = strtok(strsplit(s, "X = "){2}); X = str2num(X); 
[Y,s] = strtok(strsplit(s, "Y = "){2}); Y = str2num(Y); 
[Z,s] = strtok(strsplit(s, "Z = "){2}); Z = str2num(Z); 

これは明らかにテキストの例に固有です。あなたは変数がどのように変化するかなどの情報を私に与えていないので、ファイルが一貫していない場合は、try/catchブロックを実装する必要があるでしょう。

PS。これは連鎖操作を可能にするオクターブ構文です。 MATLABの場合は、必要に応じて別々の操作に分割します。

編集: ach、ここにはmatlabにも対応しています。 :)

s = fileread('texto'); 
C = strsplit(s, 'X = '); [X,s] = strtok(C{2}); X = str2num(X); 
C = strsplit(s, 'Y = '); [Y,s] = strtok(C{2}); Y = str2num(Y); 
C = strsplit(s, 'Z = '); [Z,s] = strtok(C{2}); Z = str2num(Z); 
+0

私はこれを使用していました。これは 'string' ####の場合にはうまくいきましたが、####' string'のようなものにどのように適応させますか?私はあなたが文字列としてファイルを読み込んで、それを一度解析するのが好きです。 – fyrepenguin

+0

'string' ####/####' string'は何を意味するのかはわかりません。例を挙げる。あなたの可能性のあるすべてのケースの具体例を与えるように質問を修正することが好ましい(そうでなければ、「うまく働いた」、「私は問題Bを持っていない、OK Bは今私がCを持っている」というゲームはあまり面白くない:// –

+4

答えを「人質」にして取引を変え続けるのは悪いエチケットです(https://www.youtube.com/watch?v = WpE_xMRiCLE):p –