我正在使用Tie :: Handle :: CSV尝试一些代码,但我想这可以使用其他模块完成,或者根本不使用。
我想要做的是获取随机布局的文件,并将其与我预测的标题匹配。然后我想把它安排到我的桌面结构中。
数据
名字,姓氏,出生日期
Jim,Johansen,08/25/1989
OR
第二名,第一名,D.O.B
约翰森,吉姆,08/25/1989
OR
第二名,第一名,D.O.B,市,县
Johansen,Jim,08/25/1989,密尔沃基,N / A
如您所见,我有不同的数据结构。我希望它将它们安排到我的模式中,即使我请求的字段是空的。我想这样做的方法是用我的列变量搜索我的输入。
这是我正在尝试的。
代码
use Tie::Handle::CSV;
my $name1 =qr/First Name|Name|1st Name/i;
my $name2 =qr/Last Name|Maiden Name|2nd Name/i;
my $date_of_birth =qr/date of birth|D.O.B/i;
my $city =qr/city|town/i;
my $csv_fh = Tie::Handle::CSV->new('list.txt', header => 1);
while (my $csv_line = <$csv_fh>)
{
print $csv_line->{'$date_of_birth'}.",".$csv_line->{'$name1'}." ".$csv_line->{'$name2'}.",".$csv_line->{'$city'}.\n"; ##note I am searching for the column {$'colummn regex'} instead of {'column'} to see if my input file matches any of the header options.
}
close $csv_fh;
我的输出是空白的,因为这个模块不理解我正在使用的正则表达式。但是,如果我使用它们的文字名称,即
,我的输出将包含指定的列我想要的输出将是:
情景1
出生日期,姓名,城市##我实施的标题
08/25 / 1989,Jim Johansen,##还注意到如果输入数据中没有“城市”,请留空。
场景2
出生日期,姓名,城市##我实施的标题
08/25 / 1989,Jim Johansen,
场景3
出生日期,姓名,城市##我实施的标题
08/25 / 1989,Jim Johansen,密尔沃基
也许有一个比模块甚至我的正则表达式变量更好的选择。有没有人不得不在不断变化的布局中解析csv?
答案 0 :(得分:3)
您永远不会在匹配(或替换)运算符中使用$name1
,$name2
等,因此您可以执行任何正则表达式匹配。
my $field_names = $csv_fh->header();
my ($name1_header) = grep /First Name|^Name$|1st Name/i, @$field_names;
my ($name2_header) = grep /Last Name|Maiden Name|2nd Name/i, @$field_names;
my ($dob_header ) = grep /date of birth|D\.O\.B/i, @$field_names;
my ($city_header ) = grep /city|town/i, @$field_names;
my @recognized_fields = ( $name1_header, $name2_header, $dob_header, $city_header );
my %recognized_fields = map { $_ => 1 } @recognized_fields;
my @other_headers = grep !$recognized_fields{$_}, @$field_names;
while (my $row = <$csv_fh>) {
my $name1 = $name1_header ? $row->{$name1_header} : undef;
my $name2 = $name2_header ? $row->{$name2_header} : undef;
my $dob = $dob_header ? $row->{$dob_header } : undef;
my $city = $city_header ? $row->{$city_header } : undef;
my @other_fields = @$row{@other_headers};
...
}