【发布时间】:2011-11-30 04:13:29
【问题描述】:
我正在尝试编写一个脚本来处理来自行为测试设备的输出。我需要在生成的 CSV 文件中按时间戳对齐所有数据。这是一个问题:测试运行之间的开始时间不同(它很接近,但不准确 - 可能会相差几秒钟到几分钟)。我可以得到我想要的输出,我想我对如何对齐所有变量有一个好主意,但不知道如何实现它。
所有数据都在具有两个级别 (%hash{id}{vars}) 的哈希中,所有变量都存储为数字以保持简单(变量名称在打印输出时从数组中读取)。从输入文件中抓取所有数据后,脚本将遍历哈希并打印出如下数据:
Variable 1
ID #1 data1 data2 data3...
ID #2 data1 data2 data3...
...
Variable 2
...
等等。
这些是 24 小时的录音。所有受试者的最后一个数据点 (var=20) 都很轻:数据在白天和晚上读取“ON”或“OFF”。我能看到的最佳对齐方法是使用关灯标记来对齐数据。
我的想法如下:
1. 查找每个 ID 的第一个位置,其中 var '20' = 'OFF' 并记录位置
2.找出哪个ID的OFF位置最大(即最早开始记录的那个)
3. 将空值对添加到每个其他主题,直到所有主题的 OFF 位置相同。
例如,如果每分钟记录一次数据,并且一个受试者的 OFF 时间比所有其他受试者晚 5 分钟,则将 5 个空数据点添加到所有其他受试者以对齐数据。
这必须针对每个对象的所有数据点进行,而不仅仅是灯的开/关测量。
这种方法行得通吗?如果是这样,我该如何实现?
**请注意,我需要能够将其打包为独立脚本以在多台计算机上运行,因此我不能指望默认未安装的 perl 模块。
--按请求编辑:示例。输入数据看起来像这样(它是一个 CSV 文件)
ID, TIME, DATA1, DATA2, DATA3, [...] , LIGHT
Subj1, 10:00:00, data1, data2, data3, [...] , ON
Subj1, 10:00:30, data1, data2, data3, [...] , ON
Subj1, 10:01:00, data1, data2, data3, [...] , OFF
Subj1, 10:01:00, data1, data2, data3, [...] , OFF
对于另一个主题,数据可能如下所示:
ID, TIME, DATA1, DATA2, DATA3, [...] , LIGHT
Subj2, 09:59:27, data1, data2, data3, [...] , ON
Subj2, 09:59:57, data1, data2, data3, [...] , ON
Subj2, 10:00:27, data1, data2, data3, [...] , ON
Subj2, 10:00:57, data1, data2, data3, [...] , OFF
Subj2, 10:01:27, data1, data2, data3, [...] , OFF
脚本从所有文件中取出每一行,并将它们添加到一个以 ID 为键的散列中,每个数据列都有一个级别,以列号为键。对于这两个文件,哈希看起来像这样:
$VAR1 = {
'Subj1' => {
'1' => [
data1
data1
...
]
'2' => [
data2
data2
...
]
...
'20' => [
ON
ON
...
}
'Subj1' => {
'1' => [
data1
data1
...
]
'2' => [
data2
data2
...
]
...
'20' => [
ON
ON
...
}
};
使用 foreach 循环输出数据:
foreach my $k (sort {$a cmp $b} keys %data) {
print OUT $k, "\,";
foreach my $d ( @{ $data{$k}{$i} } ) { print OUT $d, "\,"; }
print OUT "\n";
}
输出如下所示:
TIME
Subj1, 10:00:00, 10:00:30, 10:01:00, 10:01:30,
Subj2, 09:59:27, 09:59:57, 10:00:27, 10:00:57, 10:01:27,
DATA1
Subj1, data1, data1, data1, data1, data1,
Subj2, data2, data2, data2, data2, data2, data2,
[ ... all other data ... ]
LIGHT
Subj1, ON, ON, OFF, OFF,
Subj2, ON, ON, ON, OFF, OFF,
我需要做的是按 LIGHT 中的 ON/OFF 列对齐所有数据,方法是添加如下所示的空值:
TIME
Subj1, , 10:00:00, 10:00:30, 10:01:00, 10:01:30,
Subj2, 09:59:27, 09:59:57, 10:00:27, 10:00:57, 10:01:27,
DATA1
Subj1, , data1, data1, data1, data1, data1,
Subj2, data2, data2, data2, data2, data2, data2,
[ ... all other data ... ]
LIGHT
Subj1, , ON, ON, OFF, OFF,
Subj2, ON, ON, ON, OFF, OFF,
试图弄清楚如何最好地做到这一点。对不起,这很长......
【问题讨论】:
-
您应该提供输入示例和相应的输出,以便我们更好地了解您想要什么。最好包括一些“问题案例”,以了解需要克服的障碍。你的描述让我有点困惑,就目前而言。
-
我在 24 小时内以 30 秒的增量收集了 20 次不同的测量值 - 这些文件非常大,当所有受试者的数据组合在一起时会变得更大。我不确定我能得到它有多简单。我将编辑问题以查看是否有帮助。
-
哦。您想传播您的讲座以使其符合时间线吗?