Come posso estrarre le colonne di dati con il Perl?
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?
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.