我有一个要从中读取数据的文件。这是一个数据示例:
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是数据)。
如果下面一行不是以"NODELOAD“开头并且包含数字,那么编写一条if语句保存数据是最简单的吗?文本文件中此部分之后的最后一行将不包含任何数字,但可能为空或包含文本。
发布于 2012-11-19 20:15:11
是的,最简单的方法是将前一次调用的值保存在某个变量中,如果if(/NODELOAD/)不匹配,则只获得3个值,并使用前一行(和前一次look迭代)中的标识符处理它们。您还可以跳过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
}
}https://stackoverflow.com/questions/13453297
复制相似问题