2016-03-29 12 views
0

Sütundaki ilk giriş olan 'ELECTRICIANS' sözcüğünü aramak istediğim bir .csv dosyası var. Tüm sütunu ELECTRICIANS ismiyle yazdırmak istiyorum ve başka bir kelime gıcırsam, bir hata yazdıralım. Şimdi Bir sözcüğü bulmak için grep komutunu kullanın ve sonra sütunun tamamını perl betiğine yazdırın

my $exit = system("grep -q $column_name $file_name"); 
if ($exit == 0) 
{ 
     print "Entered column name $column_name found in file $file_name\n"; 
} 
else { 
     print "Column name not found, try again!\n"; 
     exit; 
} 

nasıl 'elektrikçiler' başlığı altında dosya içindeki sütun yazdırırım şu şekildedir:

Ben grep işlemi gerçekleştirdikten? aşağıdaki gibi .csv dosyası

İçerik geçerli:

WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 
+0

senin yaklaşımda, bir Perl değişkene senin grep komutunun sonucunu depolamak zorunda kalacaktı. Bu, sistemi ("grep ...") 'kullanamazsınız, ama' qx (grep ....) 'gibi bir şey kullanamazsınız demektir. Ama neden çizgiyi vurmak için sadece bir çocuk süreci yaratıyorsunuz? Bunu tamamen Perl'de yapabilirsin. – user1934428

+0

qx sözdiziminin farkında değilim. Grep komutunun çıktısını bir değişkene nasıl kaydederim? –

+0

'my $ output = qx (...)'. [Perlop] (http://perldoc.perl.org/perlop.html#Quote-Like-Operators) manpage sayfasına bakınız. – user1934428

cevap

0

Bir Perl yazıyoruz, sonra diğer bazı kabuk işlevi çağırmak için kabuğuna çocuk işleminin yumurtlamaya gerek yoktur. Perl, grep inşasına sahiptir. Aşağıda, aynı sonucu tamamen Perl'de nasıl elde edeceğinizi göstermek için bir örnek olarak. Ayrıca betiği açıklamak için yorumlar ekledim. her satır okumak ve bir karma koymak üzere

use strict; 
use warnings; 

#set the column name, this could be changed to accept input from user, 
#also read from the data file handle, this could also be changed to read from any other file 
my $column = "ELECTRICIANS"; 
my @headers = split(',',<DATA>); 

#Check for the column name rom the headers just read from the file handle, if not found then exit 
unless (grep {$_ eq "$column"} @headers){ 
    print "Column name $column not found, try again!\n"; 
    exit 1; 
} 

print $column, "\n"; 

#if we got to hear then the CSV file must have the column we are insterested in so start looping though the lines 
#split each line into fields then for each lin make a hash using the headers and the fields. then we can print the column 
#we are interested in 
while(<DATA>){ 
    chomp(); 
    my @fields = split(','); 
    my %data; 
    @data{@headers}[email protected]; 
    print $data{$column}, "\n"; 
} 

__DATA__ 
WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 

Bu çıkış

ELECTRICIANS 
17 
18 
14 
12 
16 
20 
13 
16 
19 
14 

üretir her bir alana ait sütunlar adını bildiğimiz gibi, aynı zamanda diğer sütunları baskı olabilir.

1

Örnek verilerinizin son satırı ek bir sütuna sahip gibi görünüyor.

Ancak bu sizin istediğiniz şeyi yapar.

#!/usr/bin/perl 

use strict; 
use warnings; 
use 5.010; 

# read header 
my @cols = split /,/, <DATA>; 

# Process the rest of the data 
while (<DATA>) { 
    my %data; 
    @data{@cols} = split /,/; 
    say $data{ELECTRICIANS}; 
} 

__DATA__ 
WEEK,SITE ENGINEERS,SITE ENGINEERS 2,ELECTRICIANS,ELECTRICIANS 2 
ONE,13,28,17,29 
TWO,13,30,18,27 
THREE,13,30,14,23 
FOUR,15,30,12,29 
FIVE,15,22,16,24 
SIX,16,30,20,30 
SEVEN,12,27,13,29 
EIGHT,19,22,16,29 
NINE,19,21,19,30 
TEN,12,22,14,30,13 
0

Sık sık benim tek gömlekleri eleştiriliyor olsun, ama burada bir tane:

perl -F, -slane ' 
    if ($. == 1) { 
     for ($i=0; $i<@F; $i++) { 
      if ($F[$i] eq $colname) { 
       $colno = $i; 
       last; 
      } 
     } 
     die "cannot find $colname column" unless defined $colno; 
    } 
    print $F[$colno] 
' -- -colname=ELECTRICIANS file.csv 
İlgili konular