Perl从大块文本中导出/解析数据

时间:2013-09-07 22:07:02

标签: regex perl parsing export

我正在尝试从大块连续文本中导出特定数据。我知道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从rawdata输出:

0001,0002,0003

相关但不独立,目标2输出是打印(再次在屏幕上或文件中,无关紧要)第一个名称和姓氏,然后是高度,逐行打印每个人

示例目标2从rawdata输出:

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

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

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

谢谢和亲切的问候, SK

2 个答案:

答案 0 :(得分:1)

您的数据与XML类似。如果您修改了格式(即通过将<first name>更改为<first_name>,您可以使用正确的XML解析器来完成繁重的工作。例如,这是如何在{{3}中获得预期的输出},XML::XSH2的包装:

open data.xml ;
echo xsh:join(',', //id) ;
for //first_name
    echo :s (.) " " following-sibling::last_name[1] ", " following-sibling::height[1] ;

答案 1 :(得分:0)

使用简单的正则表达式,

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

这将为您提供ID,对正则表达式的略微修改将为您提供您需要的名字,姓氏和身高。 有点noobish因为我是Perl的新手,有人帮助我使用类似的正则表达式。希望这有助于..