1

次のようなテキスト ファイルがあります。

(a (bee (cold down)))

を使用してロードすると

c=textscan(fid,'%s');

私はこれを得る:

'(a'
'(bee'
'(cold'
'down)))'

私が取得したいのは次のとおりです。

'('
'a'
'('
'bee'
'('
'cold'
'down'
')'     
')'
')'

textscan で 'Delimiter' を指定することで '(' と ')' で区切ることができることはわかっていますが、保持したいこの文字が失われます。

前もって感謝します。

4

3 に答える 3

1

%s指定子は、文字列が必要であることを示します。必要なのは個々の文字です。%c代わりに使用 してください。

c=textscan(fid,'%c');

単語をそのまま維持したい場合は更新%sして、指定子を使用してテキストをロードする必要があります。テキストが読み込まれた後、この問題を正規表現 (私の得意分野ではありません) で解決するか、独自のパーサーを作成して各単語を個別に解析し、括弧と単語を新しいセル配列に保存できます。

于 2012-08-16T18:51:20.753 に答える
1

私の知る限り、任意の区切り文字を保持できる定型ルーチンはありません。あなたは自分でそれをしなければならないでしょう:

string = '(a (bee (cold down)))';

bo = string == '(';
bc = string == ')';
sp = string == ' ';

output = cell(nnz(bo|bc|sp)+1,1);
j = 1;

for ii = 1:numel(string)
    if bo(ii) 
        output{j} = '(';
        j = j + 1;

    elseif bc(ii) 
        output{j} = ')';
        j = j + 1;

    elseif sp(ii) 
        j = j + 1;

    else
        output{j} = [output{j} string(ii)];

    end
end

おそらく改善される可能性があります-文字配列が大きくなると、ループがJITされなくなります。配列bc | bo | spには、このことをベクトル化するためのすべての情報が保持されています。現時点では方法がわかりません...

それでも、開始する場所を提供する必要があります。

于 2012-08-16T20:24:07.213 に答える
0

Matlab にはstrtokC に似た関数があります。その形式は次のとおりです。

token = strtok(str)
token = strtok(str, delimiter)
[token, remain] = strtok('str', ...)

文字列置換機能もありますstrrep:

modifiedStr = strrep(origStr, oldSubstr, newSubstr)

私がすることは、元の文字列を で変更しstrrepて区切り文字を追加してから、 を使用することstrtokです。すでに文字列をスキャンしてからc

c = (c,'(','( '); %Add a space after each open paren
c = (c,')',' ) '); % Add a space before and after each close paren
token = zeros(10); preallocate for speed
i = 2;
[token(1), remain] = strtok(c, ' ');
while(remain)
    [token(i), remain] = strtok(c, ' ');
    i =i + 1;
end

要求した各文字列の線形トークン配列を提供します。

strtok参照: http://www.mathworks.com/help/techdoc/ref/strtok.html

strrep参照: http://www.mathworks.com/help/techdoc/ref/strrep.html

于 2012-08-16T20:55:19.030 に答える