我正在尝试从大块连续文本中导出特定数据。我知道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
答案 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的新手,有人帮助我使用类似的正则表达式。希望这有助于..