3

次のようなテキストファイルに複数の行があります

.model sdata1 s tstonefile='../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p' passive=2

MATLAB で一重引用符の間のテキストを抽出したいと考えています。

多くの助けをいただければ幸いです。

4

5 に答える 5

2

簡単な方法の 1 つは、文字列を一重引用符区切り文字で分割し、出力で偶数番号の文字列を取得することです。

str = fileread('test.txt');
out = regexp(str, '''', 'split');
out = out(2:2:end);
于 2013-10-18T14:54:36.393 に答える
2

複数のブロック内のすべてのテキストを取得するには''、regexp を次のように使用できます。

regexp(txt,'''(.[^'']*)''','tokens')

これは、キャプチャされたテキスト'に a を含まない文字で囲まれたテキストを取得することを示しています。'たとえば、このファイルを 2 行で考えてみましょう (別のファイル名を作成しました)。

txt = ['.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'' passive=2 ', char(10), ...
'.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_3port_via_minstub.s00p'' passive=2']
>> stringCell = regexp(txt,'''(.[^'']*)''','tokens');
>> stringCell{:}
ans = 
    '../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'
ans = 
    '../data/s_element/isdimm_rcv_via_3port_via_minstub.s00p'
>> 

トリビア:

  • char(10)10 は改行の ASCII コードであるため、改行文字を指定します。
  • (コーディング ワードの残りの部分にある) パターン内の.文字は、通常、改行と一致しないため、より安全なパターンになります。MATLAB では、ドット inは newline と一致するため、これを無効にするには、最後の入力引数として `regexp`` に追加します。これは、代わりに引用符の外側のテキストを取得しないようにするのに便利ですが、最初の一致が優先されるため必要ありません。regexpregexregexp'dotexceptnewline'
  • 'との一致からa を除外する代わりに、次のように[^'']一致を非貪欲にすることができます。?regexp(txt,'''(.*?)''','tokens')
于 2013-10-17T18:39:16.357 に答える
2

textscan を使用する場合:

fid = fopen('data.txt','r');
rawdata = textscan(fid,'%s','delimiter','''');
fclose(fid);

output = rawdata{:}(2)

他の回答でも使用されているように、単一のアポストロフィ'は二重のアポストロフィで表され''ます。たとえば、区切り記号の場合です。

コメントを考慮して:

fid = fopen('data.txt','r');
rawdata = textscan(fid,'%s','delimiter','\n');
fclose(fid);

lines = rawdata{1,1};
L = size(lines,1);
output = cell(L,1);
for ii=1:L
    temp = textscan(lines{ii},'%s','delimiter','''');
    output{ii,1} = temp{:}(2);
end
于 2013-10-17T16:48:28.343 に答える
1

これは、正規表現を使用して行うことができます。引用符の間にテキストが 1 回だけ出現すると仮定すると、次のようになります。

% select all chars between single quotation marks.
out = regexp(inputString,'''(.*)''','tokens','once');
于 2013-10-17T16:43:49.290 に答える
1

情報を抽出する行を特定したら、それをトークン化するか、すべて同じ形式の場合は次のようにします。

test='.model sdata1 s tstonefile=''../data/s_element/isdimm_rcv_via_2port_via_minstub.s50p'' passive=2';
a=strfind(test,'''')
test=test(a(1):a(2))
于 2013-10-17T16:48:12.137 に答える