2011-08-17 3 views
0

저는 Perl을 처음 접했고 이에 대한 해결책을 모으기 위해 노력해 왔습니다. 이 프로그램을 실행하면 오류가 발생하지 않으며 아무 것도 표시되지 않습니다. 다음과 같이Perl은 탭으로 구분 된 파일의 특정 열을 추출하는 데 어떻게 사용할 수 있습니까?

코드는 다음과 같습니다

내 테스트 데이터 파일이 내가 실제 시험 데이터 파일을 사용하기 전에이 어떻게 작동하는지보기 위해 시도하고이

Camera Make  Camera Model Text Ball Swing 
a  b  c  d  e 
f  g  h  i  j 
k  l  m  n  o 

과 같은

#!/usr/bin/perl 
open (DATA, "<test1.txt") or die ("Unable to open file"); 
use strict; use warnings; 
my $search_string = "Ball"; 
while (my $row = <DATA>) { 

    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 

    if ($cells[0] =~/$search_string/){ 
     print $cells[0]; 
    } 
} 

..

그래서 "공"을 검색하고 "공"을 반환하려면 어떻게합니까?

+1

Perl에 도움을 요청하는 중입니다. 위의 코드는 마지막 행에서 요구하는 것과 아무 관계가 없기 때문에 과제를 작성해야합니다.Perl에서 구현하려는 알고리즘을 작성한 다음 Perl 구현이 작동하지 않는 이유를 묻습니다. 현재 귀하의 질문에 대한 대답은 "귀하의 코드는 귀하의 업무와 아무런 관련이 없습니다"라고 약속드립니다. – DVK

+0

나는 이것을 약속합니다. 과제가 아니지만 ... 어쨌든 ... 어떻게 적용 할 수 없는가 .. 내가 찾고있는 것을 정의하고 텍스트를/\ t/내가 믿는 탭이라고 생각하고 배열에 저장하고있다. .. 내가 무엇을 요구하는지 "배열을 검색하고 관련 열을 얻는 방법은 무엇입니까? –

+1

내 대답의 힌트를 참조하십시오. 파일을 올바르게 파싱 중이며 문제를 해결하는 논리/알고리즘을 사용하지 않고 있습니다. 힌트는 당신의 공을 구르도록하기에 충분해야합니다 (아무 말장련도 의도하지 않음) – DVK

답변

0

대신보십시오 : 당신은 매우 편리하게 당신을 위해 데이터를 추출 Text::CSV_XS을 사용할 수 있습니다

#!/usr/bin/perl 
use strict; 
use warnings; 

open (DATA, "<test1.txt") or die ("Unable to open file"); 
my $search_string = "Ball"; 

my $header = <DATA>; 
my @header_titles = split /\t/, $header; 
my $extract_col = 0; 

for my $header_line (@header_titles) { 
    last if $header_line =~ m/$search_string/; 
    $extract_col++; 
} 

print "Extracting column $extract_col\n"; 

while (my $row = <DATA>) { 
    last unless $row =~ /\S/; 
    chomp $row; 
    my @cells = split /\t/, $row; 
    print "$cells[$extract_col] "; 
} 
+0

이것은 작동합니다 ...하지만 어떻게했는지 이해하지 못합니다 ... '내 $ header = ' 그 파일을 가져 와서 $ 헤더에 넣은 다음 당신이 만든 @header 제목 헤더 파일을 탭으로 점등 시키지만 열이 아닌 행 이름을 열 이름을 넣지 않습니까? –

+0

@David : 그건 <> 작동 방식이 아닙니다. 스칼라 컨텍스트에서는 파일에서 한 줄을 읽습니다. [Perlop 매뉴얼의 I/O 연산자 부분을 읽어보십시오.] (http://perldoc.perl.org/perlop.html). –

+1

당신이 ** 세 가지 논점 [open] (http://perldoc.perl.org/functions/open.html) –

2

r eason 당신은 당신의 프로그램이 당신이 말한 바를 정확히 수행하기 때문에 에러가 발생하지 않는다. (문자열 "Ball"을 포함하는 모든 첫번째 컬럼 값을 출력한다.) 첫 번째 열의 셀에는 해당 문자열이 들어 있지 않으므로 프로그램은 아무것도 인쇄하지 않습니다. , 당신의 알고리즘와 이다 (하지만 대부분 괜찮 - - 특히 당신이 open()의 오래된 양식을 사용하고는 약간의 문체 개선을 사용할 수 있습니다)

귀하의 문제는 펄이 아니다.

힌트 : 알고리즘의 첫 번째 작업은 번호 (열 번호)가 "볼"열을 찾아야합니다.

0

. 제한된 데이터에는 과도한 부담이 될 수 있지만 매우 견고한 솔루션입니다. 여기

난 그냥 데이터를 포함하는 DATA 태그를 사용하지만, 당신이 원하는 경우, 당신은 open my $fh, '<', 'text1.txt'; 등, 파일 핸들로 그것을 대체하고 $fh*DATA을 변경할 수 있습니다.

출력 :

d i n 

코드 :

use warnings; 
use strict; 
use Text::CSV_XS; 
use autodie; 

my $csv = Text::CSV_XS->new({ sep_char => "\t" }); 
my @list; 
$csv->column_names ($csv->getline (*DATA)); 
while (my $hr = $csv->getline_hr(*DATA)) { 
    push @list, $hr->{'Ball'}; 
} 

print "@list\n"; 
__DATA__ 
Camera Make Camera Model Text Ball Swing 
a b c d e 
f g h i j 
k l m n o 

ETA : 당신이 그것을 밖으로 시도 & 붙여 넣기를 잘라려고하는 경우에, 탭이 이월되어 있는지 확인 데이터에.

2

이 밖으로 시도 :

use strict; 
use warnings; 
use Data::Dumper; 
use List::MoreUtils qw<first_index>; 

my $column = first_index { $_ eq 'Ball' } split /\t/, <DATA>; 
say Data::Dumper->Dump([ $column ], [ '*column' ]); 
my @balls = map { [split /\t/]->[$column] } <DATA>; 
say Data::Dumper->Dump([ \@balls ], [ '*balls' ]); 
__DATA__ 
Camera Make Camera Model Text Ball Swing 
a b c d e 
f g h i j 
k l m n o 

당신은 꽤 많이 open -ed 일부 파일에 DATA에서 핸들을 변경해야합니다.

open(my $in, '<', '/path/to/data.file') 
    or die "Could not open file: $!" 
    ; 

그리고 <$in>에 대한 <DATA>을 대체합니다.

+0

+1 쿨 솔루션;) – TLP

관련 문제