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 つの連続したブロックです)

目標 1 の出力は、rawdata に存在するすべての人の ID をコンマ区切りの行としてファイルに出力する (または単に画面に出力する) ことです (そのため、id タグ内に含まれるすべての情報についてファイルをスキャンします)。

上記の rawdata からの目標 1 の出力例:

0001,0002,0003

関連するが独立していない、目標 2 の出力は (画面上またはファイル上でかまいません) 名と姓を一緒に出力し、次に高さを各人の行ごとに出力することです。

上記の rawdata からの目標 2 の出力例:

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

私たちが実際にやろうとしていることは、それよりも少し複雑ですが、上記の出力を取得できれば、必要に応じて拡張および変更できると確信しています。

また、私たちがここでやろうとしていることと非常によく似たものに関連するリソースを見て喜んでいます

SK さん、ありがとうございます。

4

2 に答える 2

1

データは XML に似ています。フォーマットを修正すると (つまり、 に変更<first name>すること<first_name>で)、適切な XML パーサーを使用して困難な作業を行うことができます。たとえば、これはXML::LibXMLのラッパーであるXML::XSH2で期待される出力を取得する方法です

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 が得られます。正規表現を少し変更すると、必要な名前、姓、および身長が得られます。うまくいけば、これは役に立ちます..

于 2013-09-12T12:21:54.407 に答える