2012-11-19 9 views
1

데이터를 읽으려는 파일이 있습니다. 나는이 코드를 가지고 있고, 1 행의 모든 ​​값을 읽어 배열에 저장할 수 있어요파일에서 두 줄의 데이터 읽기

NODELOAD   28  27132 3.29108E+04 7.94536E+04 0.00000E+00 
NODELOAD   29  27083 9.89950E+04 9.89950E+04 0.00000E+00 
NODELOAD   29  27132 6.08112E+04 6.08112E+04 0.00000E+00 
NODELOAD   30  27083 1.29343E+05 5.35757E+04 0.00000E+00 
NODELOAD   30  27132 7.94536E+04 3.29108E+04 0.00000E+00 
NODELOAD   31  68 4.80185E+04 -5.47647E+04 -1.17033E+04 
           -1.27646E+03 1.18350E+04 -2.03885E+03 
NODELOAD   31  1114 1.20706E+05 -3.31323E+04 -7.17280E+04 
           2.28198E+03 2.75582E+04 5.74460E+02 

:이 데이터의 샘플입니다 그러나

foreach my $line (@input) { 
    if($line =~ /^\s*NODELOAD\s+/i) { 
     $line =~ s/^\s*//; 
     @a = split(/\s+/,$line); 

     $modelData{"NODELOAD"}->{$a[1]}->{$a[2]}->{"Fx"} = $a[3]; 
     $modelData{"NODELOAD"}->{$a[1]}->{$a[2]}->{"Fy"} = $a[4]; 
     $modelData{"NODELOAD"}->{$a[1]}->{$a[2]}->{"Fz"} = $a[5]; 

, 일부는 "이있다 파일에서 두 행에 정의되고 3 대신로드 값이 6 인 NODELOAD 정의가 있습니다 (각 행의 처음 두 숫자는 ID이고, 다음 3/6은 데이터입니다).

if 문을 쓰는 것이 가장 쉽습니다. 다음 문구가 "NODELOAD"로 시작하지 않고 숫자가 포함되어 있으면 데이터를 저장합니까? 텍스트 파일에서이 부분 다음의 마지막 줄에는 숫자가 포함되지 않지만 공백이거나 텍스트를 포함 할 수 있습니다.

답변

1

예, 가장 쉬운 방법은 이전 호출의 값을 일부 변수에 보관하는 것입니다. if(/NODELOAD/)이 일치하지 않으면 값을 3 개만 가져 와서 이전 줄의 식별자와 이전 반복 반복을 사용하여 처리합니다. 또한 if에서 정규 표현식을 건너 뛰고 분할 결과의 첫 번째 요소를 확인할 수 있습니다 :이 좋아 보인다

my @last_values; 
foreach my $line (@input) { 
    $line =~ s/^\s+//; 
    my @values = split(/\s+/, $line); 
    if($values[0] ne 'NODELOAD') { 
     unshift(@values, @last_values[0..2]); # Get first 3 values from previous call 
     # Then process it however you'd like to 
     $modelData{"NODELOAD"}->{$values[1]}->{$values[2]}->{"Fx2"} = $values[3]; 
    } 
    elsif { 
     # process like previously... 
     $modelData{"NODELOAD"}->{$values[1]}->{$values[2]}->{"Fx"} = $values[3]; 
     $modelData{"NODELOAD"}->{$values[1]}->{$values[2]}->{"Fy"} = $values[4]; 
     $modelData{"NODELOAD"}->{$values[1]}->{$values[2]}->{"Fz"} = $values[5]; 
     @last_values = @values; # and save for future reference 
    } 
} 
+0

그러나 내가에서 읽고 있어요 파일이 다른 데이터를 많이도 포함되어 있음을 지적해야 따라서 초기에'if ($ line = ~/^ \ * * NODELOAD \ s +/i) {'코드가 필요합니다. 그렇지 않으면 다른 데이터를 가져옵니다. –

+0

당신의 방법을 사용하고 해결했습니다. 감사! –