我正在使用以下代码来解析相当大的 xml 文件(> 50GB):
use XML::Parser;
my $p = new XML::Parser(
'Handlers' => {
'Start' => \&handle_start,
'End' => \&handle_end,
'Char' => \&handle_char,
}
);
$p->parsefile( 'source.xml' );
...
sub handle_start {
...
}
问题是解析需要很长时间,我想要某种进度表。
我更喜欢一种不需要先扫描整个文件就可以得到总计数的方法 - 例如,输入文件中的当前位置将是完美的,因为我可以简单地在开始时检查文件的总大小,然后在 handle_start() 中检查当前位置,并打印它。
最佳答案
您可能正在寻找解析器对象的current_byte
方法,它记录在XML::Parser::Expat 中。 .
因此您可以在开始解析之前将文件的大小保存在全局中:
my $file_size = -s $input_file;
然后像这样在处理程序中计算您的进度:
sub handle_start {
my($parser, $element) = @_;
my $pos = $parser->current_byte;
printf("%-20s %5.1f%%\n", $element, $pos * 100 / $file_size);
}
关于xml - 使用 XML::Parser 解析大型 XML 文件时如何查看进度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3277163/