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) 保存为单独的变量。但是,如您所见,两条信息的变量名称(CENTRAL INDEX KEY 和 COMPANY CONFORMED NAME)完全相同。

我使用以下代码提取所有者的信息,但我不知道如何为公司提取数据。(注意:我将整个文本文件读入 $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

与其尝试匹配字符串中的元素,不如将其拆分为行,并正确解析为可以轻松进行此类搜索的数据结构,例如:

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

这应该相对容易做到。

于 2013-02-13T20:33:07.247 回答
0

同时选择这两个信息位,以便您知道您正在获取与所有者或公司相关联的 CENTRAL INDEX KEY。

($name, $cik) = $data =~ /COMPANY\s+CONFORMED\s+NAME:\s+(.+)$\s+CENTRAL\s+INDEX\s+KEY:\s+(.*)$/m;
于 2013-02-13T20:33:25.733 回答
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字符并阻止它们进入$ownnameand $comname

于 2013-02-13T20:29:51.683 回答
-1

搜索OWNER DATA:多读一行,拆分:并取最后一个字段。标题相同COMPANY DATA:(排序),依此类推

于 2013-02-13T20:30:50.703 回答