使用Perl从文本文件中提取文本

时间:2013-02-13 20:23:15

标签: regex perl text extract

我有一个与使用正则表达式从文本文件中提取数据相关的问题。我有一个文本文件,格式如下:

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;}

我是否知道如何为所有者和公司提取信息?

谢谢!

5 个答案:

答案 0 :(得分: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

不是很酷吗?所有代码都安全可维护的代码☺

答案 1 :(得分: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的路径。

答案 2 :(得分:0)

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

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

这应该相对容易。

答案 3 :(得分:0)

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

($name, $cik) = $data =~ /COMPANY\s+CONFORMED\s+NAME:\s+(.+)$\s+CENTRAL\s+INDEX\s+KEY:\s+(.*)$/m;

答案 4 :(得分:-1)

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