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];

ただし、ファイルには 2 行で定義され、3 ではなく 6 つの負荷値を持つ "NODELOAD" 定義がいくつかあります (各行の最初の 2 つの数字は識別子で、次の 3/6 はデータです)。

if次の行が「NODELOAD」で始まらず、数字が含まれている場合、データを保存するステートメントを作成するのが最も簡単ですか? テキスト ファイルのこの部分の後の最後の行には数字が含まれませんが、空白またはテキストが含まれる場合があります。

4

1 に答える 1

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
    }
 }
于 2012-11-19T12:15:11.217 に答える