2011-02-13 4 views
1

J'ai les données suivantes (à partir d'un fichier texte), je voudrais diviser/obtenir chaque élément, et même ces éléments qui sont des blancs (certains grades que vous pouvez voir ne sont pas répertoriés, qui signifie qu'ils sont 0, donc je veux les obtenir aussi)Tokenizing avec Perl et données non structurées

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      *** 

Le problème que vous pouvez le voir, je ne suis pas un délimiteur spécifique, car certaines qualités manquent, si elles ne sont pas, je ne pouvais avoir toutes les données de la ligne de départ jusqu'à la première année ('A') et ensuite toutes les notes et les diviser par/\ s + /, mais ce n'est pas le cas. des suggestions (s'il y en a .... ....) serait génial.

grâce,

+6

Les colonnes sont-elles vraiment mal alignées ou s'agit-il d'un mauvais travail de copier-coller? – cjm

+0

Une solution REELLE serait d'obtenir ces données sous forme correctement formatée si vous le pouvez - celui-ci sent trop pour être 100% correctement analysable. Si ce n'est vraiment pas une option, alors allez avec l'analyseur de largeur fixe de CPAN (zoul trouvé un) – DVK

Répondre

3

Il y a des irrégularités aux endroits dans certaines colonnes (notez que les premières valeurs totales 18 et 75 sont partiellement dans la colonne suivante), mais si vous n'avez pas besoin eux, vous pouvez essayer quelque chose comme ceci:

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 ... 
----- --  ---- ... 

vous pourriez avoir besoin de modifier les limites de la colonne dans le modèle pour déballer des données réelles, mais cela devrait vous aider à démarrer.

3

Cela ressemble, il serait préférable d'écrire ou de trouver un analyseur de texte en colonnes? J'ai trouvé DataExtract-FixedWidth sur CPAN, mais je n'ai aucune expérience personnelle avec. Le format semble assez désordonné, en particulier avec les chiffres sur les bordures des colonnes. Vous auriez à faire une sorte de pré-traitement ou heuristique de toute façon ...

Questions connexes