Bob*_* M. 2 html xml matlab extract large-files
我的系统中保存了一个HUUUGE HTML文件,其中包含产品目录中的数据.数据的结构使得对于每个产品记录,名称在两个标签(名称)和(/名称)之间.
每个产品最多有3个属性:name,productID和color,但并非所有产品都具有所有这些属性.
如何在不混淆产品属性的情况下为每种产品提取这些数据?该文件也是50兆字节!
代码示例....
<name>'hat'</name>
blah blah blah
<prodId>'1829493'</prodId>
blah blah blah
<color>'cyan'</color>
blah blah
blah blah blah
blah blah blah
<name>'shirt'</name>
blah blah blahblah blah blah
<prodId>'193'</prodId>
<name>'dress'</name>
blah blah blah
blah blah blah
<prodId>'18'</prodId>
<color>'dark purple'</color>
Run Code Online (Sandbox Code Playgroud)
大小为50 MB的文件不是那么大,你不能只是将其内容作为字符串直接加载到MATLAB中,你可以使用函数FILEREAD:
strContents = fileread('yourfile.html');
Run Code Online (Sandbox Code Playgroud)
假设您具有上面的文件格式,则可以使用函数REGEXP解析内容(使用命名令牌捕获):
expr = '<(?<tag>name|prodId|color)>''([^<>]+)''</\k<tag>>';
tokens = regexp(strContents,expr,'tokens');
tokens = vertcat(tokens{:});
Run Code Online (Sandbox Code Playgroud)
和内容token使用您的样本文件的内容将是:
tokens =
'name' 'hat'
'prodId' '1829493'
'color' 'cyan'
'name' 'shirt'
'prodId' '193'
'name' 'dress'
'prodId' '18'
'color' 'dark purple'
Run Code Online (Sandbox Code Playgroud)
则可能需要解析得到的N-通过-2细胞阵列和放置内容在一个结构阵列与字段'name','prodId'和'color'.困难在于并非每个条目都包含所有三个字段.假设每个'name'会后跟一个'prodId',一个'color',或两个(顺序'prodId' 则 'color'),然后将下面的代码应该为你工作:
s = struct('name',[],'prodId',[],'color',[]); %# Initialize structure
nTokens = size(tokens,1); %# Get number of tokens
nameIndex = find(strcmp(tokens(:,1),'name')); %# Find indices of 'name'
[s(1:numel(nameIndex)).name] = deal(tokens{nameIndex,2}); %# Fill 'name' field
%# Find and fill 'prodId' that follows a 'name':
index = strcmp(tokens(min(nameIndex+1,nTokens),1),'prodId');
[s(index).prodId] = deal(tokens{nameIndex(index)+1,2});
%# Find and fill 'color' that follows a 'name':
index = strcmp(tokens(min(nameIndex+1,nTokens),1),'color');
[s(index).color] = deal(tokens{nameIndex(index)+1,2});
%# Find and fill 'color' that follows a 'prodId':
index = strcmp(tokens(min(nameIndex+2,nTokens),1),'color');
[s(index).color] = deal(tokens{min(nameIndex(index)+2,nTokens),2});
Run Code Online (Sandbox Code Playgroud)
和内容s使用您的样本文件的内容将是:
>> s(1)
name: 'hat'
prodId: '1829493'
color: 'cyan'
>> s(2)
name: 'shirt'
prodId: '193'
color: []
>> s(3)
name: 'dress'
prodId: '18'
color: 'dark purple'
Run Code Online (Sandbox Code Playgroud)