1

网页包含由某些列显示并由标签 "pre" "/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}。

4

1 回答 1

0

抱歉花了一点时间,但这里是:

正如我所说,我首先使用 textscan 按行(\n 分隔符)加载数据。然后我可以分别评估每一行,看看它是否与指定的正则表达式匹配:

'\w*/\w*......\w*\.\w.....\d\d..\d...\d\d'

元字符如此处所述

接下来我只是遍历值以仅获取匹配的值(因为其他值没有被正则表达式匹配)

有一种方法可以对其进行矢量化,但是这个简单的循环现在应该可以解决问题。另请注意,这是一种非常专有的检测模式的方法,数据列之间字符间距的任何变化都必须与新的元字符串匹配。

最终匹配的行包含在单元格中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

文本.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

希望这仍然是相关的

于 2014-03-19T22:59:40.397 回答