#!/usr/bin/env perl
use strict;
use warnings;
sub cut2fmt {
my @positions = @_;
my $template = "";
my $lastpos = 1;
for my $place (@positions) {
$template .= "A" . ($place - $lastpos) . " ";
$lastpos = $place;
}
$template .= "A*";
return $template;
}
my $fmt = cut2fmt(9, 16, 26, 45, 68, 90, 112, 117, 122, 127, 131);
my @keys = qw{
subject course section
instructor_first_name instructor_last_name
completed_the_class dropped_the_class
grade_A grade_B
grade_C grade_D
grade_F
};
our @All_Records;
while (<DATA>) {
next if 1 .. /^\s*\|/;
my %rec;
@rec{@keys} = unpack($fmt, $_);
for my $key (grep { /^grade_[A-F]$/ } @keys) {
$rec{$key} ||= 0;
}
push @All_Records, \%rec;
}
for my $rec (@All_Records) {
for my $key (@keys) {
print "$key: $rec->{$key}\n";
}
print "\n";
}
__END__
Subject Course Section Instructor Last Name A B C D F
Name Completed the Class Dropped the Class
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
1 2 3 4 5 6 7 8 9 0 1 2 3 4
1234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890
| | | | | | | | | | |
ACCT 201 01 Karin Hatheway Dial 56 6 19 9 16 2 5
ACCT 202 01 Karin Hatheway Dial 69 11 37 14 7 2 6
ACCT 205 01 Darryl Woolley 20 1 3 7 6 1 3
ACCT 205 02 Darryl Woolley 28 1 6 7 13 2
ACCT 205 03 Darryl Woolley 42 5 4 13 21 1 3
ACCT 205 04 Darryl Woolley 23 1 9 5 8 1
ACCT 205 05 Darryl Woolley 30 2 11 7 9 2 1
ACCT 205 06 Darryl Woolley 25 3 8 9 6 1 1
ACCT 275 01 Darryl Woolley 33 2 7 15 9 1 1
ACCT 310 01 Marla Kraut 16 1 1 6 7 2
ACCT 310 02 Marla Kraut 64 5 43 15 1
ACCT 310 03 Marla Kraut 72 3 11 47 10 3 1
ACCT 311 01 Karin Hatheway Dial 45 13 20 11 1
ACCT 311 02 Karin Hatheway Dial 25 10 12 3
ACCT 315 01 Jason Porter 26 6 5 8 6 1
ACCT 315 02 Jason Porter 29 1 6 10 5 7 1
ACCT 414 01 Teresa Gordon 22 1 6 6 9 1
ACCT 483 01 Glen Utzman 26 1 7 13 6
ACCT 486 01 Teresa Gordon 33 13 14 6
ACCT 492 01 Jason Wills 23 5 8 9 1
ACCT 515 01 Jeffrey Harkins 15 7 6 1
ACCT 561 01 Jason Porter 18 1 10 7 1
ADOL 526 13 Charles Gagel 21 2 19 1 1
ADOL 573 13 Martha Yopp 28 16 3 1
ADOL 574 01 Laura Holyoke 16 12 3 1
ADOL 574 11 Laura Holyoke 9 1 8 1
ADOL 574 13 Laura Holyoke 15 10 4 1
ADOL 600 13 Roger Scott 19 4 1
AERO 101 01 William Beauter 11 8 2 1
AERO 103 01 Sarah Babbitt 15 7 6 1 1
AERO 411 01 Sarah Babbitt 11 6 4 1
AERO 413 01 Sarah Babbitt 12 8 3 1
Первое, что вам нужно сделать, это нормализовать ваши данные.Ваши столбцы противоречивы, и я не могу сказать вам, почему это может быть.Возможно, у вас есть вкладки, которые нужно пропустить через expand -8
или что-то еще.Я включаю только данные, которые имеют одинаковое выравнивание.
Чтобы каждый раз получать правильный формат unpack
, вам просто нужно нарисовать пронумерованную линейку, как у меня под ней.Поставьте отметку |
там, где начинается каждое поле.Запишите это число и передайте его включенной функции cut2fmt()
.Он превратит эти числа в шаблон pack/unpack
.
Вот и все, что нужно сделать.
Я скажет вам, куда обращаться с такими самородками, но япросто ненавижу настойчивых самореклам, так что было бы лицемерно, если бы я так низко опустился.Я не буду этого делать.Если кто-то хочет разместить рекламу, хорошо, пусть покупают спамверты с сайта.Тогда те из нас, кто ненавидит спам-рекламу, могут заблокировать наши блокировщики рекламы.В противном случае это просто неприлично для меня в желудке.