我有一个与使用正则表达式从文本文件中提取数据相关的问题。我有一个文本文件,格式如下:
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;}
我是否知道如何为所有者和公司提取信息?
谢谢!
答案 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)相同,依此类推