Domanda

Ho corde di questo tipo

NAME1              NAME2          DEPTNAME           POSITION
JONH MILLER        ROBERT JIM     CS                 ASST GENERAL MANAGER 

Voglio l'uscita sia nome1 nome2 e la posizione come posso farlo tramite split / regex / assetto / etc e senza l'utilizzo di moduli CPAN?

È stato utile?

Soluzione

Se i dati in ingresso entra come un array di stringhe (@strings), questo

for my $s (@strings) {
   my $output = join ' ',
                map /^\s*(.+)\s*$/ ? $1 : (),
                unpack('A19 A15 x19 A*', $s);
   print "$output\n"
}

sarebbe estrarre e tagliare le informazioni necessarie.

  

NOME1 | NAME2 | POSIZIONE

e

  

JONH MILLER | ROBERT JIM | ASST DIRETTORE GENERALE

(La '|' sono stati inclusi da me per una migliore iscrizione esplicativa del risultato)

Saluti

RBO

Altri suggerimenti

Sta andando a dipendere campi lunghezza se coloro sono fissati, o se sono separati tab. Il metodo più semplice (tramite split) è se sono scheda separata.

my ($name1, $name2, $deptName, $position) = split("\t", $string);

Se sono lunghezza fissa, e ammesso che sono tutti, per esempio, lungo 10 caratteri, è possibile analizzarlo come

my ($name1, $name2, $deptName, $position) = unpack("A10 A10 A10 A10", $string);

Partendo dal presupposto che lo spazio tra i campi non sono fissi così stringa divisa sulla base di due o più spazi in modo che non si romperà il nome come JONH MILLER in due parti .

#!/usr/bin/perl
use strict;
use warning;
my $string = "NAME1              NAME2          DEPTNAME           POSITION
             JONH MILLER        ROBERT JIM     CS                 ASST GENERAL MANAGER ";
my @string_parts = split /\s\s+/, $string;
foreach my $test (@string_parts){  
      print"$test\n";
}

Da lì il campione, un unico spazio appartiene nei dati, ma 2 o più spazi contigui non lo fanno. Così si può facilmente dividere su 2 o più spazi. L'unica cosa che aggiungere a questo è l'uso di List::MoreUtils::mesh

use List::MoreUtils qw<mesh>;
my @names   = map { chomp; $_ } split /\s{2,}/, <$file>;
my @records = map { chomp; { mesh( @names, @{[ split /\s{2,}/ ]} ) } } <$file>;

Si consideri utilizzando autosplit in Perl one-liner dalla riga di comando:

$ perl -F/\s{2,}/ -ane 'print qq/@F[0,1,3]\n/' file

L'one-liner dividerà in due o più spazi consecutivi e stampare il primo, secondo e quarto settori che corrispondono alla NAME1, NAME2 e campi POSIZIONE.

Naturalmente, questo si romperà se si dispone di un solo spazio che separa le voci NAME1 e NAME2, ma sono necessarie maggiori informazioni su file, al fine di accertare quale potrebbe essere il miglior modo di agire.

a Split con spazi:

@string_parts = split /\s{2,}/, $string;

Questa dividerà $string in una lista di stringhe. Il separatore sarà il \s+ regex, i quali mezzi di uno o più caratteri di spaziatura . Questo include spazi, tabulazioni, e (se non mi sbaglio) a capo.

Modifica vedo che uno dei requisiti non è per dividere su un solo spazio, ma per parti separate su due o più. Ho modificato il regex di conseguenza.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top