извлекать данные из файлов Excel и структурировать их в хеши - PullRequest
2 голосов
/ 21 декабря 2011

У меня есть файл Excel с тремя столбцами, который имеет следующий шаблон

12   A    P1  
23   B    P5
24   C    P2
15   D    P1
06   E    P5

Структура, лежащая в основе этого набора данных, такова, P1 содержит A и D; A соответствует 12 и D соответствует 15 P2 содержит C; C соответствует 24 P5 содержит B и E; B соответствует 23 и E соответствует 06

Я хочу представить структуру такого типа в хешированной структуре, то есть использовать P1 в качестве ключа для указания на хеш, а A используется в качестве ключа для этого хэша второго уровня. Есть ли способ реализовать это в Perl?

Ответы [ 4 ]

2 голосов
/ 21 декабря 2011

Spreadsheet::ParseExcel может использоваться для анализа .xls файлов. Ниже приведен пример программы, которая создает желаемую структуру данных.

#!/usr/bin/env perl

use strict;
use warnings;

use Data::Dumper;
use Spreadsheet::ParseExcel;

my $parser    = Spreadsheet::ParseExcel->new;
my $workbook  = $parser->parse( shift or die "Please provide a file\n" );
my $worksheet = $workbook->worksheet(0);

my %data;
for my $row ( 0 .. $worksheet->row_range ) {
    my $value     = $worksheet->get_cell( $row, 0 )->value;
    my $key       = $worksheet->get_cell( $row, 1 )->value;
    my $super_key = $worksheet->get_cell( $row, 2 )->value;
    $data{$super_key}->{$key} = $value;
}

print Dumper \%data;

выход

$VAR1 = {
          'P5' => {
                    'E' => '06',
                    'B' => '23'
                  },
          'P2' => {
                    'C' => '24'
                  },
          'P1' => {
                    'A' => '12',
                    'D' => '15'
                  }
        };
1 голос
/ 21 декабря 2011

В прошлом мне приходилось обрабатывать данные в электронных таблицах.Если вы имеете дело с небольшим количеством файлов Excel, экспортируйте их вручную в файлы CSV с помощью программного обеспечения для работы с электронными таблицами, такого как Excel.Затем проанализируйте файл CSV и сохраните значения ячеек в хэш хэшей в perl:

#!/usr/bin/env perl
use warnings;
use strict;

use Data::Dumper::Simple;

my $file = "";
my @row = ();
my $rowidx = 1;
my %hh = (); # hash of hashes

open( INFILE, "input.csv" ) or die("Can not open input file: $!");

while ( $file = <INFILE> ) {
    @row = parse($file);
    chomp(@row);

    $hh{ $row[2] }{ $row[1] } = $row[0];
    #warn Dumper %hh; # debug

    $rowidx++;
}

close(INFILE);

warn Dumper %hh;

exit;

sub parse {
    my @newrow  = ();
    my $columns = shift; # read next row
    push( @newrow, $+ ) while $columns =~ m{"([^\"\\]*(?:\\.[^\"\\]*)*)",?|([^,]+),?|,}gx; # parse and store columns to array 
    push( @newrow, undef ) if substr( $columns, -1, 1 ) eq ',';
    return @newrow;
}

Выполнение этого дает

$ more input.csv
12,A,P1
23,B,P5
24,C,P2
15,D,P1
06,E,P5
$ ./ReadCSV.pl input.csv 
%hh = (
    'P5' => {
              'E' => '06',
              'B' => '23'
            },
    'P2' => {
              'C' => '24'
            },
    'P1' => {
              'A' => '12',
              'D' => '15'
            }
  );
1 голос
/ 21 декабря 2011

Есть функция Spreadsheet :: ParseExcel , которая довольно неплохо справляется с анализом обычной таблицы *.xls.

К счастью, есть расширение с именем Spreadsheet :: XLSX , которое работает с Spreadsheet::ParseExcel, чтобы также читать *.xlsx электронные таблицы. Методы, используемые в Spreadsheet::ParseExcel, работают как с файлами *.xls, так и *.xlsx, если у вас также установлен Spreadsheet::XLSX.

0 голосов
/ 21 декабря 2011

В какой версии excel файлы отформатированы?
У меня был очень хороший опыт чтения (и записи) файлов .xls с использованием модулей Spreadsheet::ParseExcel (Spreadsheet::WriteExcel для вывода)

К сожалению, я делал это 4 года назад, и формат .xlsx не был таким распространенным, поэтому я не могу говорить за них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...