У меня есть смешанный файл, разделенный символами, со строкой заголовка, которую я пытаюсь прочитать с помощью Text:: CSV, который я успешно использовал в файлах, разделенных запятыми, для извлечения массива хэшей в других сценариях. Я читал, что Text::CSV не поддерживает несколько разделителей (пробелы, табуляции, запятые), поэтому я пытался очистить строку с помощью регулярного выражения перед использованием Text::CSV. Не говоря уже о том, что в файле данных также есть строки комментариев в середине файла. К сожалению, у меня нет прав администратора для установки библиотек, которые могут содержать несколько sep_chars, поэтому я надеялся, что смогу использовать Text::CSV или другие стандартные методы для очистки заголовка и строки перед добавлением в AoH. Или мне следует отказаться от Text::CSV?
Я, очевидно, все еще учусь. Заранее спасибо.
Пример файла:
#
#
#
# name scale address type
test.data.one 32768 0x1234fde0 float
test.data.two 32768 0x1234fde4 float
test.data.the 32768 0x1234fde8 float
# comment lines in middle of data
test.data.for 32768 0x1234fdec float
test.data.fiv 32768 0x1234fdf0 float
Выдержка из кода:
my $fh;
my $input;
my $header;
my $pkey;
my $row;
my %arrayofhashes;
my $csv=Text::CSV({sep_char = ","})
or die "Text::CSV error: " Text::CSV=error_diag;
open($fh, '<:encoding(UTF-8)', $input)
or die "Can't open $input: $!";
while (<$fh>) {
$line = $_;
# skip to header row
next if($line !~ /^# name/);
# strip off leading chars on first column name
$header =~ s/# //g;
# replace multiple spaces and tabs with comma
$header =~ s/ +/,/g;
$header =~ s/t+/,/g;
# results in $header = "name,scale,address,type"
last;
}
my @header = split(",", $header);
$csv->parse($header);
$csv->column_names([$csv->fields]);
# above seems to work!
$pkey = 0;
while (<$fh>) {
$line = $_;
# skip comment lines
next if ($line =~ /^#/);
# replace spaces and tabs with commas
$line =~ s/( +|\t+)/,/g;
# replace multiple commas from previous regex with single comma
$line =~ s/,+/,/g;
# results in $line = "test.data.one,32768,0x1234fdec,float"
# need help trying to create a what I think needs to be a hash from the header and row.
$row = ?????;
# the following line works in my other perl scripts for CSV files when using:
# while ($row = $csv->getline_hr($fh)) instead of the above.
$arrayofhashes{$pkey} = $row;
$pkey++;
}
$arrayofhashes{$pkey}
не является массивом хэшей. Это хэш хэшей, где ключами являются индексы.s/t+/,/g
не заменяет вкладки, а заменяетt
s. Вы также выполняете замены на$header
, который пуст. Вы должны использоватьuse strict; use warnings;
, и вы должны ограничить область ваших переменных до минимума, а не объявлять их все в начале скрипта. - person TLP   schedule 18.08.2013