【发布时间】:2022-01-28 00:35:22
【问题描述】:
基本问题是我有很多具有标准化名称的数据点,这些数据点刚刚从服务器转储到文件中,但我需要根据它们包含的数据自动将这些数据点组织到具有行和列的文件中(以它们的标准化名称表示)。
包含所有数据点的原始文件如下(这些不是原始数据点标签,而是简化的标签):
temp_r301
airflow_r301
temp_r345
airflow_r345
solar_w
solar_e
...
如您所见,它们都以一列的形式出现,因此每行有一个标签。
我想对它们进行组织,以便对于每个状态(“温度”,如温度),我在同一行中有相应的信息,例如:
temp_r301 301 airflow_r301 solar_w solar_e #airflow in 301 and general solar radiation affect temperature (state) in room 301
temp_r345 345 airflow_r345 solar_w solar_e #airflow in 345 and general solar radiation affect temperature (state) in room 345
当然,数组的长度可能会有所不同,因此我们的想法是制定一种算法来检测长度并相应地组织数据。另外,我知道我必须使用正则表达式来查找匹配项并定义哪些数据点是状态,哪些是输入,以及知道它们所属的房间。
到目前为止,我已经尝试了以下方法:
use strict;
use warnings;
use diagnostics;
my @transpose = ();
my @sorted = ();
push(@sorted, [qw(temp_r301 temp_r345)]);
push(@sorted, [qw(301 345)]);
push(@sorted, [qw(airflow_r301 airflow_r345 solar_w solar_e)]);
for my $sorted (@sorted) {
for my $column (0 .. $#sorted) {
push(@{$transpose[$column]}, $sorted->[$column]);
}
}
for my $new_row (@transpose) {
for my $new_col (@{$new_row}) {
print "$new_col ";
}
print "\n";
}
但这只有在所有数组都具有相同长度的情况下才能正常工作(不是这种情况)。
我还发现了一个循环,可用于将数据存储为矩阵形式(数组的数组),但我似乎仍然无法找到将来自不同数组的数据写入矩阵的解决方案:
use strict;
use warnings;
use diagnostics;
use feature 'say';
my @states = qw(temp_r301 temp_r345);
my @zones = qw(301 345);
my @inputs = qw(airflow_r301 airflow_r345 solar_w solar_e);
my @matrix = ();
for my $x (0 .. $#states) {
for my $y (0 .. $#inputs) {
$matrix[$x][$y] = $states[$x]; #of course this only copies the states array and
} #repeats it for each created array
}
for my $aref (@matrix) { #print array of arrays
say "[ @$aref ],";
}
那么,知道我已将所有数据转储到输入文件中,将这些数据排序到矩阵中的最佳方法是什么?有没有我应该更加注意的循环?我应该使用数组吗?
【问题讨论】:
-
什么规则决定了
@disturb的元素是否应该包含在给定的状态中? -
@Matthias 感谢您的回复。那么我在上面的评论中提出的问题怎么样,有一个逗号/制表符分隔的文件和列出的列?然后每一行确实是您作为示例显示的内容,其中输入数据中缺少的字段将只是空的。这似乎(在我看来)是你需要的?
-
@Matthias 好的,谢谢。数据操作不是问题,问题是关于理解你想要做什么。那么,输入文件中的数据看起来如何?问题中没有显示,而是数组是(在我假设读取数据之后)。您可以从输入文件中添加几行到问题中吗?我当然可以使用这些数组,但是如果您确实有要处理的文件,那么最好使用它。
-
谢谢!还有一个问题,在我发布一些内容之前:在您显示的数据中,如何判断
solar_X是否影响房间 301 或 345,或两者兼而有之,或其他...? (在这个例子中,它出现在 301 和 345 之后(紧跟在 345 之后),但我怀疑这是一个通用标准?)所有其他短语都有房间号,所以它们很容易组织,但solar_X什么都没有,并且很可能还有其他短语/变量中没有房间号。 (这也是@Shawn 一开始就问的问题。) -
回复this,您不是在尝试排序,而是在尝试分组。这通常使用哈希来完成。问题是不清楚你想如何分组。为什么 MET+EL____MEA+POW 与 LI____COM.POS+LI.INT+7.STEP (301,4,9; 345,19,24) 分组?如果是“情况就是这样”,我们需要知道这些关联的列表。这就是“受其影响”吗?如果是这样,我将首先创建一个影响受影响事物的哈希映射事物。我会使用
push @{ $grouped{$room}{$thing_affected} }, $.;对这些内容进行分组