0

我正在尝试从大量连续文本中导出特定数据。我知道 PERL 是为做这样的事情而设计的。从互联网上的示例和包括这里我有一些关于如何去做的线索,但是我无法立即携带或修改一些东西来解决我的问题。

我相信我正在做的事情很简单。

示例原始数据 (rawdata.txt) 如下所示:

<id>0001</id><first name>John</first name><last name>Smith</last name><height>180</height><weight>95</weight><id>0002</id><first name>David</first name><last name>Jones</last
name><height>175</height><weight>120</weight><id>0003</id><first name>Jacob</first 
name><last name>Fitzpatrick</last name><height>165</height><weight>105</weight>

(不方便用行分隔,只是一个连续的块)

目标 1 输出是将原始数据中存在的所有人的 id 作为逗号分隔行输出到文件(或仅打印到屏幕)(因此扫描文件以获取 id 标签中包含的所有信息)

上述原始数据的示例目标 1 输出:

0001,0002,0003

相关但不独立,目标 2 输出是打印(再次在屏幕上或到文件,没关系)每个人的名字和姓氏,然后是身高

上述原始数据的示例目标 2 输出:

John Smith, 180
David Jones, 175
Jacob Fitzpatrick, 165

我们真正想做的事情比这要复杂一些,但我确信如果我们能得到上述输出,那么我们可以根据需要进行扩展和修改。

也很高兴查看与我们在这里尝试做的非常相似的事情的任何资源

谢谢和亲切的问候, SK

4

2 回答 2

1

您的数据类似于 XML。如果您修复格式(即通过更改<first name><first_name>,您可以使用适当的 XML 解析器来完成艰苦的工作。例如,这是如何在XML::XSH2中获得预期的输出,这是一个围绕XML::LibXML的包装器:

open data.xml ;
echo xsh:join(',', //id) ;
for //first_name
    echo :s (.) " " following-sibling::last_name[1] ", " following-sibling::height[1] ;
于 2013-09-07T22:20:40.580 回答
0

使用简单的正则表达式,

            if ( m/<id>(.*?)</)
                    {
                        push(@rrr, $1);
                    }
            my $id = join(',', @rrr);
            print $id;

这将为您提供 id,对正则表达式进行轻微修改将为您提供名字、姓氏和所需的高度。有点笨,因为我对 Perl 有点陌生,有人帮助我使用了类似的正则表达式。希望这有帮助..

于 2013-09-12T12:21:54.407 回答