基于随机头部布局perl解析CSV

时间:2015-03-03 21:19:51

标签: regex perl variables csv

我正在使用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?

1 个答案:

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

   ...
}