Токенизация с Perl и неструктурированными данными - PullRequest
1 голос
/ 13 февраля 2011

У меня есть следующие данные (из текстового файла), я хотел бы разделить / получить каждый элемент, и даже те элементы, которые являются пробелами (некоторые оценки, как вы можете видеть, не перечислены, что означает, что они равны 0, поэтому Я тоже хочу их получить)

CRN SUB      CRSE   SECT   COURSE TITLE         INSTRUCTOR        A   A- B+ B     B- C+ C     C- D+ D     D- F    I   CR NC W     WN INV TOTAL
----- --     ----   ----   -----------------   ----------------- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- --- -----
33450 XX     9950   AIP    OVERSEAS-AIP SPAI   NOT FOUND                                                               1   1                2
33092 XX     9950   ALB    ddddddd, SPN. vi   NOT FOUND                                                               1                    1
33494 XX     9950   W16    OVERSEAS Univ.Wes   NOT FOUND                                                               1                    1

                           INSTRUCTOR TOTALS NOT FOUND             2                                                1   18   1    2          24
                           PERCENTAGE DISTRI NOT FOUND             8                                                4   75   4    8       ******

33271 PE 3600 001          Global Geography    sfnfbg,dsdassaas        2    2    1    1    2    3    6    5    3    3   1                        29

                           INSTRUCTOR TOTALS snakdi,plid          2    2    1    1    2    3    6    5    3    3   1                        29
                           PERCENTAGE DISTRI krapsta,lalalal          7    7    3    3    7   10   21   17   10   10   3                     ***

Проблема, как вы можете видеть, у меня нет определенного разделителя, потому что некоторые оценки отсутствуют, если бы их не было, я мог бы получить все данные от начала строки до первого класса ('A') ), а затем все оценки и деление их на / \ s + /, но это не так. любые предложения (если таковые имеются ...) были бы замечательными.

спасибо,

Ответы [ 2 ]

3 голосов
/ 13 февраля 2011

В некоторых столбцах есть неровности (обратите внимание, что первые итоговые значения 18 и 75 частично находятся в следующем столбце), но если они вам не нужны, вы можете попробовать что-то вроде этого:

my @data;

# skip header
my $hdr = <DATA>;
my $sep = <DATA>;

while(<DATA>) {
    chomp;

    # skip empty and total lines
    next if /^\s*$/ || /^[ ]{5}/;

    push @data, [
        map { s/^\s+//; s/\s+$//; $_ }      # trim each column
        unpack 'A6A7A7A7 A18A20 A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4A4 A10', $_
    ];
}

use Data::Dump;
dd \@data;

__DATA__
CRN SUB      CRSE ...
----- --     ---- ...

Возможно, вам придется настроить границы столбцов в шаблоне распаковки для реальных данных, но это должно помочь вам начать работу.

3 голосов
/ 13 февраля 2011

Похоже, что было бы лучше написать или найти анализатор текста на основе столбцов?Я нашел DataExtract-FixedWidth на CPAN, но не имею никакого личного опыта с ним.Формат выглядит довольно грязно, особенно с числами на границах столбцов.В любом случае вам придется выполнить какую-то предварительную обработку или эвристику ...

...