网页包含一些列显示的数据,并由标记" pre"分隔。 " /预" :
ColumnA ColumnB ColumnC ColumnD ColumnE
01/2050 1009.0 11 9
01/1950 1009.0 8
01/1850 1009.0 11 8 82
01/1750 1009.0 10 87
01/1650 1008.0 10 7 82
01/1550 1008.0 11 8 82
我使用以下代码获取它们
s = regexp(urlpage, '<PRE[^>]*>(.*?)</PRE>', 'tokens');
s = [s{:}]';
%token to rows (cell)
row = textscan(s{1}', '%s', 'delimiter', '\n');
但是在这种情况下,我不知道所有元素的价值,我想阅读每一个元素,我试过
splitstring = textscan(row{1}{r},'%s');
和
splitstring = textscan(row{1}{r},'%s %f %d %d %d');
但是没有检测到空白! 例如在第二行我检测到{3x1 cell}而不是{5x1 cell}。
答案 0 :(得分:0)
正如我所说,我首先使用逐行加载文本(\ n分隔符)来加载数据。然后,我可以分别评估每一行,看它是否与以下指定的正则表达式匹配:
'\w*/\w*......\w*\.\w.....\d\d..\d...\d\d'
元字符如here
所述接下来,我只是遍历值,只获得匹配的(因为其他人没有匹配正则表达式)
有一种方法可以对此进行矢量化,但这个简单的循环现在可以解决这个问题。 另请注意,这是一种检测模式的非常专有的方法,因此必须使用要匹配的新元字符串来满足数据列之间的字符间距的任何更改。
最终匹配行包含在单元格y
clear
clc
ftoread = 'text.txt';
fid = fopen(ftoread);
data = textscan(fid,'%s','Delimiter','\n','EmptyValue',NaN);
fclose(fid);
x = data{1}
c=1;
for ind=1:size(x,1)
m = regexp(x{ind},'\w*/\w*......\w*\.\w.....\d\d..\d...\d\d','match');
if ~isempty(m)
y{c} = m;
c=c+1;
end
end
<强>的text.txt 强>
01/2050 1009.0 11 9 87
01/1950 1009.0 8 93
01/1850 1009.0 11 8 82
01/1750 1009.0 10 87
01/1650 1008.0 10 7 82
01/1550 1008.0 11 8 82
01/1450 1008.0 82
希望这仍然相关