2

正規表現を使用してテキストファイルからデータを引き出すことに関連する質問があります。次の形式のテキストファイルがあります。

REPORTING-OWNER:    

    OWNER DATA: 
        COMPANY CONFORMED NAME:         DOE JOHN
        CENTRAL INDEX KEY:          99999999999

    FILING VALUES:
        FORM TYPE:      4
        SEC ACT:        1934 Act
        SEC FILE NUMBER:    811-00248
        FILM NUMBER:        11530052

    MAIL ADDRESS:   
        STREET 1:       7 ST PAUL STREET
        STREET 2:       STE 1140
        CITY:           BALTIMORE
        STATE:          MD
        ZIP:            21202

ISSUER:     

    COMPANY DATA:   
        COMPANY CONFORMED NAME:         ACME INC
        CENTRAL INDEX KEY:          0000002230
        IRS NUMBER:             134912740
        STATE OF INCORPORATION:         MD
        FISCAL YEAR END:            1231

    BUSINESS ADDRESS:   
        STREET 1:       SEVEN ST PAUL ST STE 1140
        CITY:           BALTIMORE
        STATE:          MD
        ZIP:            21202
        BUSINESS PHONE:     4107525900

    MAIL ADDRESS:   
        STREET 1:       7 ST PAUL STREET SUITE 1140
        CITY:           BALTIMORE
        STATE:          MD
        ZIP:            21202

所有者の名前(John Doe)と識別子(99999999999)、および会社の名前(ACME Inc)と識別子(0000002230)を別々の変数として保存したいと思います。ただし、ご覧のとおり、変数名(CENTRALINDEXKEYとCOMPANYCONFORMEDNAME)は、両方の情報でまったく同じです。

次のコードを使用して所有者の情報を抽出しましたが、会社のデータを抽出する方法がわかりません。(注:テキストファイル全体を$ dataに読み込みます)。

if($data=~m/^\s*CENTRAL\s*INDEX\s*KEY:\s*(\d*)/m){$cik=$1;}
if($data=~m/^\s*COMPANY\s*CONFORMED\s*NAME:\s*(.*$)/m){$name=$1;}

所有者と会社の両方の情報を抽出する方法について何かアイデアはありますか?

ありがとう!

4

5 に答える 5

3

正規表現(メンテナンスの悪夢)を使ってすばやく汚くすることと、正しく行うことには大きな違いがあります。

たまたま、あなたが与えたファイルはYAMLに非常によく似ています。

use YAML;
my $data = Load(...);
say $data->{"REPORTING-OWNER"}->{"OWNER DATA"}->{"COMPANY CONFORMED NAME"};
say $data->{"ISSUER"}->{"COMPANY DATA"}->{"COMPANY CONFORMED NAME"};

プリント:

DOE JOHN
ACME INC

かっこいいじゃないですか。安全で保守可能なコードの数行ですべて☺</p>

于 2013-02-13T20:51:02.007 に答える
0
my ($ownname, $ownkey, $comname, $comkey) = $data =~ /\bOWNER DATA:\s+COMPANY CONFORMED NAME:\s+([^\n]+)\s*CENTRAL INDEX KEY:\s+(\d+).*\bCOMPANY DATA:\s+COMPANY CONFORMED NAME:\s+([^\n]+)\s*CENTRAL INDEX KEY:\s+(\d+)/ms

UNIXオペレーティングシステムでこのファイルを読んでいるが、Windowsで生成された場合、行末\r\nは単なる\nではなく文字ペアで示されます。この場合は、次のようにする必要があります。

$data =~ tr/\r//d;

最初にこれらの文字を取り除き、それらがとに入るのを\r防ぐため$ownname$comname

于 2013-02-13T20:29:51.683 に答える
0

文字列内の要素を一致させようとする代わりに、文字列を行に分割し、データ構造に適切に解析して、次のように簡単に検索できるようにします。

$data->{"REPORTING-OWNER"}->{"OWNER DATA"}->{"COMPANY CONFORMED NAME"}

それは比較的簡単なはずです。

于 2013-02-13T20:33:07.247 に答える
0

所有者または会社のいずれかに関連付けられたCENTRALINDEXKEYを取得していることがわかるように、両方の情報を同時に選択します。

($name, $cik) = $data =~ /COMPANY\s+CONFORMED\s+NAME:\s+(.+)$\s+CENTRAL\s+INDEX\s+KEY:\s+(.*)$/m;
于 2013-02-13T20:33:25.733 に答える
-1

もう1行読んで検索しOWNER DATA:、分割し:て最後のフィールドを取得します。COMPANY DATA:ヘッダー(sortof)についても同じです。

于 2013-02-13T20:30:50.703 に答える