xml - 使用 XML::Parser 解析大型 XML 文件时如何查看进度?

标签 xml perl parsing progress

我正在使用以下代码来解析相当大的 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/

相关文章:

php - 在php中解析xml

perl - 获取在 Perl 中使用反引号执行的命令的返回值

perl - 自动纠正 Lingua::LinkParser 包含 lib 路径

xml - Visual Studio 2010 排序 xml/xaml 属性

java - hyperjaxb3 不生成文件

javascript - 无法使用 Cloud Code 找出 Parse Config

c# - 有没有办法让字符串达到年份值?

php - 我如何使用 PHP Simple HTML DOM Parser 来解析它?

android - 由 30 多个 View 组成的自定义 View 呈现缓慢

python - 列出正则表达式匹配的所有模式