我想寫解析略有不同格式的CSV文件與頭一個木類和返回代表對文件中的數據對象的列表。下面的代碼的簡化版本:perl的類來解析指定CSV文件類型的類似數據的不同列
package MyParser;
use Moose;
use namespace::autoclean;
use Text::CSV_XS;
use MyData; #class that represents data for each row of csv
has 'type' => (is => 'ro', isa => 'Str', required => 1);
sub get_data {
my($self, $file) = @_;
open my $fh, '<', $file || die "Can't open file $!";
my $csv = Text::CSV_XS->new;
$csv->column_names($csv->getline($fh));
my @data;
if ($self->type eq 'filetype1'){
while (my $row = $csv->getline_hr($fh)){
push @data, MyData->new(field1 => $row->{col1},
field2 => $row->{col2},
field3 => $row->{col3},
);
}
}
elsif ($self->type eq 'filetype2'){
while (my $row = $csv->getline_hr($fh)){
push @data, MyData->new(field1 => $row->{colA},
field3 => _someFunction($row->{colB}), # _someFunction does some manipulation with the data
field5 => $row->{colC},
);
}
}
elsif ($self->type eq 'filetype3'){
while (my $row = $csv->getline_hr($fh)){
push @data, MyData->new(field1 => $row->{column_1},
field2 => _someOtherFunction($row->{column_2}), # _someOtherFunction does some manipulation with the data
field3 => $row->{column_3},
field4 => $row->{column_4},
field5 => $row->{column_5},
);
}
}
close $fh;
return \@data;
}
__PACKAGE__->meta->make_immutable;
1;
類邁德特只是一個簡單的數據結構,其中一些屬性具有默認屬性(因此從上面的不同的初始化)。某些csv文件類型也有一些需要某些操作的列(例如需要進入簡單公式的數字),這些操作是依賴於文件類型的。這個MyData然後返回到我的主腳本插入到oracle中的表中。
我的目標是MyParser處理某些指定類型的,如果需要,並從GET_DATA方法返回邁德特的列表,可擴展的CSV文件。但是,現在的方法似乎並不像我想要解決的問題那麼簡單。
所以我想問問是什麼/上意見是:
是否有解決這個(通過設計模式也許如工廠模式)的更好/更簡單的方法?
或者我想解決一些看起來很簡單的事情,讓事情變得複雜嗎?
感謝代碼示例,使用配置文件是我一直在想我可以下去,所以讓別人按照同樣的思路思考是令人放心的 – 1stdayonthejob 2012-07-30 21:52:09