Если ваши данные не включают поля в кавычках, например a,b,c,"complicated field, quoted",e,f,g
, нет преимущества в использовании Text::CSV
перед простым split /,/
.
В этом примере данные классифицируются по хэшу, к которому вы можете получить простой и прямой доступ. Я использовал Data::Dump
только для того, чтобы показать содержимое полученной структуры данных.
use strict;
use warnings;
use autodie;
open my $fh, '<', 'mydata.csv';
my $category;
my %data;
while (<$fh>) {
chomp;
my @data = split /,/;
my $cat = shift @data;
$category = $cat if $cat =~ /\S/;
push @{ $data{$category} }, \@data;
}
use Data::Dumper;
$Data::Dumper::Useqq = 1;
print Dumper \%data;
вывод
{
"Category 1" => [
[" header1", " header2", " header3", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
],
"Category 2" => [
[" header1", " header2", " header3", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
],
"Category 3" => [
[" header1", " header2", " header3", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
[" data", " data", " data", "..."],
],
}
Обновить
Если все, что вам нужно, это разделить данный раздел файла, нет необходимости помещать его в хеш. Эта программа сделает то, что вы хотите.
#!/usr/bin/perl
use strict;
use warnings;
use autodie;
my ($file, $wanted) = @ARGV;
open my $fh, '<', $file;
my $category;
while (<$fh>) {
my ($cat) = /\A([^,]*)/;
$category = $cat if $cat =~ /\S/;
print if $category eq $wanted;
}
Запустите его вот так в командной строке
get_category.pl mydata.csv 'Category 2' > cat2.csv
вывод
Category 2, header1, header2, header3,...,
, data, data, data,...,
, data, data, data,...,
, data, data, data,...
person
Borodin
schedule
04.06.2014
Text::CSV_XS
- person Hunter McMillen   schedule 04.06.2014