您可以从我的代码中看到,我有两个循环,因为对于每个面值有 5 个 bor 值。所以我有 50 个带有输出 .out 扩展名的文件。因此,我使用两个循环将文件自动输入到代码中。我的目标是制作一个 .csv 文件,其中包含一列 1 个面值,以及从不同 bor 值文件中获取的 5 列不同值,并且对于不同面值的行也是如此。对于这些组合中的每一个,我的面值对于所有 5 个 bor 值都保持不变,但是我的 bor 值对于每个组合都会发生变化。因此,我每行需要 6 列,第一列将具有所有 5 个不同 bor 值的相同常量值,并且第 2 列到第 6 列将具有不同的值,我将从这些文件中获取这些值。
因此,第一列应该只是单个票面值,其余 5 列中有 5 个 bor 值。当我运行代码时,它会使用 if 语句从 bor 和 par 打印我需要的所有值,这些值位于这些文件的特定区域中。问题是它不会在我的输出 .csv 文件中打印任何内容。它只是打印最后一个面值与最后一个 bor 值的组合值。在本例中为 1,3500
#!/usr/bin/perl
# the strict package forces you to declare each variable you use beforehand
use strict;
# a variable in strict mode is declared using my
# the $ symbol means it is a single-valued variable
# the @ symbol means it is an array
# each declaration/instruction is closed with a ; sign
my @par_list = (0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1);
#bor is my boron concentration list
my @bor_list = (0,800,1600,2500,3500);
# creating a variable for the current value of the parameter
my $value;
my $value_2;
# get and store the size of the array
my $nbr_of_values = $#par_list;
my $nbr_of_values_2 = $#bor_list;
# now, we read in a variable that will be the filename of the template input file
# $ARGV are the input arguments, 0 means it is the first one (perl starts counting at 0, not 1)
my $file_in = $ARGV[0];
# start of the loop
for( my $i=0; $i<= $nbr_of_values; $i++){
#create another loop for boron values and assign a letter j to it
for ( my $j=0; $j<= $nbr_of_values_2; $j++){
$value_2 = $bor_list[$j];
$value = $par_list[$i];
print "This is the current parameter value: $value \n";
# now we create a new string variable that will later be the filename of the new input deck
# the . symbol is the concatenation operator between strings
my $new_output_filename = $file_in."file_in_".$value."_".$value_2.".out";
print " The new filename is $new_output_filename \n";
my $result_filename = $file_in."_".".csv";
# open the template file and store its filehandle (fh_in)
open my $fh_out, '<', $new_output_filename or die "Can't open output $new_output_filename !";
# open the new file (it currently does not exist and is thus empty) and store its filehandle (fh_out)
open my $fh_res, '>', $result_filename or die "Can't open output $result_filename !";
while (<$fh_out>) {
# this is for you to see on the console, we read line-by-line, while there is something
# the line read is stored in a special PERL variable $_
# now we actually print that line into the new file
# BUT BEFORE THAT, we change the dummy characters for the real value
# we use a regular expression (read the tutorials for more details_
# s = substitute
if ((/ COO /)&& (/ INPUT/)) {
print "found burnup $_ ";
my @array = split(/\s+/,$_);
#print "the bu value is $array[3] \n";
print $fh_res "$array[2] ,";
}
if ((/ K-INF /) && (/M2 =/)) {
print "found kinf $_ ";
#print "the bu value is $array[3] \n";
print $fh_res "$array[7] ,";
}
}
close $fh_out;
close $fh_res;
}
}
print " I am done with this !!! \n";
exit 111;
答案1
我认为您的具体问题(只有最后一个值出现在输出文件中)是由于$fh_res
在内循环内以写入模式打开而引起的。打开文件有 3 种基本模式:读 ( '<'
)、写 ( '>'
) 和追加 ( '>>'
)。 “写入”和“附加”之间的区别在于,使用前者会丢弃任何现有内容,而使用“附加”则保留它们。
在您的代码片段中,我建议在定义 .csv 文件之后直接将用于定义 csv 文件的文件名和文件句柄的行移到循环之外$file_in
。
如果这个片段实际上是真实事物的简化版本,并且您有一些充分的理由在内部循环中打开和重新打开 csv 文件,那么我认为您可以通过将模式'>'
(write) 替换为'>>'
(append )。