【问题标题】:Reading two lines of data from a file从文件中读取两行数据
【发布时间】:2012-11-19 11:55:40
【问题描述】:

我有一个要从中读取数据的文件。这是数据样本:

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

但是,文件中有一些“NODELOAD”定义在两行上定义,并且有 6 个加载值而不是 3 个(每行的前两个数字是标识符,后面的 3/6 是数据)。

编写if 语句是否最简单,如果以下行不以“NODELOAD”开头并且包含数字,则该语句会保存数据?文本文件中此部分之后的最后一行将不包含任何数字,但可能为空白或包含文本。

【问题讨论】:

    标签: perl file


    【解决方案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
        }
     }
    

    【讨论】:

    • 这看起来不错,但是我应该指出我正在读取的文件还包含许多其他数据,因此我仍然需要开头的初始 if($line =~ /^\s*NODELOAD\s+/i) { 代码,否则它将获取其他数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 1970-01-01
    • 2018-12-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多