文本扫描和白色空间

时间:2014-03-18 21:23:38

标签: matlab textscan

网页包含一些列显示的数据,并由标记" 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}。

1 个答案:

答案 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

希望这仍然相关