Nin*_*Cat 0 xml perl search text-processing
我有一个巨大的文件(500 MB)组织如下:
<link type="1-1" xtargets="1;1">
<s1>bunch of text here</s1>
<s2>some more here</s2>
</link>
<link type="1-1" xtargets="1;1">
<s1>bunch of text here</s1>
<s2>some more here</s2>
</link>
<link type="1-1" xtargets="1;1">
<s1>bunch of text here</s1>
<s2>some more here</s2>
</link>
Run Code Online (Sandbox Code Playgroud)
我想把它转换成一种新格式,其中s1转到一个新文件,每个s1在它自己的行上有一个换行符,而s2转到一个新文件,每个s2在它自己的行上.
Perl是去这里的方式吗?如果是这样,有人可以告诉我如何实现这一目标吗?
我热烈建议使用XML :: Twig,因为它能够处理XML数据流.你可以使用这样的东西:
use XML::Twig;
my $xml = new XML::Twig( TwigHandlers => { link => \&process_link });
$xml->parsefile('Your file here');
sub process_link
{
my($xml, $link) = @_;
# You can now handle each individual block here..
Run Code Online (Sandbox Code Playgroud)
一个诀窍是做类似的事情:
my $structure = $link->simplify;
Run Code Online (Sandbox Code Playgroud)
现在它是hashrefs和arrayrefs的混合,具体取决于结构!一切,包括属性,
print Dumper $structure; exit;
Run Code Online (Sandbox Code Playgroud)
您可以使用Data :: Dumper检查它以获取您需要的内容.
只要记得在完成后将其清除以释放内存.
$link->flush;
}
Run Code Online (Sandbox Code Playgroud)
使用XML解析器.这个问题非常适合使用基于事件的解析器进行解析,所以我建议查看内置的XML :: Parser或XML :: SAX模块是如何工作的.您应该能够为要处理的每种标记创建两个事件处理程序,并将匹配的内容指向两个单独的文件.
归档时间: |
|
查看次数: |
469 次 |
最近记录: |