3

我在一些文本文件中有多行,例如

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

我想在 MATLAB 中提取单引号之间的文本。

很多帮助将不胜感激。

4

5 回答 5

2

一种简单的方法是使用单引号分隔符拆分字符串并在输出中获取偶数字符串:

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

要获取多个''块内的所有文本,可以使用正则表达式,如下所示:

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

这表示要获取由字符包围的文本,在捕获的文本'中不包括 a 。'例如,考虑这个文件有两行(我编了不同的文件名),

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确实匹配换行符,因此要禁用它,我们可以将作为最后一个输入参数添加到 `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

您可以使用正则表达式来做到这一点。假设引号之间只出现一次文本:

% 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 回答