刚刚发现 Octave,并且主要来自 Matlab 背景,我很惊讶这样的程序的存在。
这是我正在使用 Octave 处理的数据示例:
#Recipe: VAC Test
#Pressure: TORR
#Temp.: C
#TC Labels: TC0;TC1;TC2;TC3;TC4;TC5;TC6;TC7;TC8;TC9;TC10;TC11;TC12;TC13;TC14;TC15;TC16;TC17;TC18;TC19;TC20;TC21;TC22;TC23
230915 13:51:52;1;1;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:53;2;2;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:54;3;3;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
~
~
~
230918 07:27:47;236156;236156;1.396E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:48;236157;236157;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:49;236158;236158;1.399E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:50;236159;236159;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:51;236160;236160;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:52;236161;236161;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
我目前已设置脚本将日期和时间之间的空格替换为“;”为了保持定界的一致性,然后继续将数据放入矩阵中。 我可以轻松获得我主要需要的数据——日期(第 1 列)、压力(第 5 列)和两个温度值(最后两列)。
但是,当时我很困惑,然后是日期的格式......我需要它们来绘制温度和压力的图。
日期是YYMMDD格式,而这种格式恰好是Octave似乎不支持输出的格式(根据https://octave.sourceforge.io/octave/function/datestr.html)。
使用 dlmread,时间将仅包含冒号之前的第一个数字。 示例:13:51:52 的值为 13
我尝试过 csv2cell,但它似乎将其放入一个巨大的 Rx1 向量中,而不是矩阵中。
该脚本的目标是最终将其转换为可执行文件,用户将在其中输入真空室的日志文件,输出将是 i) 修改后的文件,以及 ii) 两张温度和压力图日期和时间。
9 月 26 日编辑: 我想将 datenum()、datestr() 与第一列中的数据一起使用。但是,由于数据以 YYMMDD 格式显示,我无法在此处使用任何指定的代码格式:octave.sourceforge.io/octave/function/datestr.html 从它的外观来看,我需要将其拆分为 YY、MM, DD,并将其与 datenum() 一起使用以正确输入。我试过:
textscan(file, '%s %s', 'delimiter', ';', 'headerlines', 4)
连同:
textscan(file, '%d %d', 'delimiter', ';', 'headerlines', 4)
textscan(file, '%d %d:%d:%d', 'delimiter', ';', 'headerlines', 4)
但是它们都以空向量的形式返回,或者只是带有文件名的单个向量。
如有任何帮助,我们将不胜感激,谢谢。
这绝不是最快的方法,但即使您的数据是数字,使用
dlmread
以外的其他方法可能会更好。一些方法:
如果您告诉 datevec 格式是什么,则该日期格式是可读的。例如,
datevec("230915 13:51:52", "yymmdd HH:MM:SS")
ans =
2023 9 15 13 51 52
为了读取数据,如果我首先手动修剪掉所有
~
行,则会留下:
#Recipe: VAC Test
#Pressure: TORR
#Temp.: C
#TC Labels: TC0;TC1;TC2;TC3;TC4;TC5;TC6;TC7;TC8;TC9;TC10;TC11;TC12;TC13;TC14;TC15;TC16;TC17;TC18;TC19;TC20;TC21;TC22;TC23
230915 13:51:52;1;1;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:53;2;2;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230915 13:51:54;3;3;9.000E+2;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;19.6;19.1
230918 07:27:47;236156;236156;1.396E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:48;236157;236157;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:49;236158;236158;1.399E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:50;236159;236159;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:51;236160;236160;1.398E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
230918 07:27:52;236161;236161;1.397E-4;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;26.5;26.3
然后以下工作可以接受:
fid = fopen ('data.txt');
data = textscan(fid, "%d %d:%d:%d;%d;%d;%f;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;-;%f;%f\n", "he
aderlines",4)
data =
{
[1,1] =
230915
230915
230915
230918
230918
230918
230918
230918
230918
[1,2] =
13
13
13
7
7
7
7
7
7
[1,3] =
51
51
51
27
27
27
27
27
27
[1,4] =
52
53
54
47
48
49
50
51
52
[1,5] =
1
2
3
236156
236157
236158
236159
236160
236161
[1,6] =
1
2
3
236156
236157
236158
236159
236160
236161
[1,7] =
9.0000e+02
9.0000e+02
9.0000e+02
1.3960e-04
1.3970e-04
1.3990e-04
1.3980e-04
1.3980e-04
1.3970e-04
[1,8] =
19.600
19.600
19.600
26.500
26.500
26.500
26.500
26.500
26.500
[1,9] =
19.100
19.100
19.100
26.300
26.300
26.300
26.300
26.300
26.300
}
fclose(fid);
现在,每个单元格条目都是数据的列之一。在这里,它们仍然是数字。您也许可以使用 %s 分隔符将某些分隔符保留为字符串,或尝试将日期组件保留在一起的其他格式字符串,但我发现这很容易从 textscan 输出的元胞数组中进行解析。由于它们的长度相同,因此您的日期和时间位于前四个元素中:
dates = data(1:4)
dates =
{
[1,1] =
230915
230915
230915
230918
230918
230918
230918
230918
230918
[1,2] =
13
13
13
7
7
7
7
7
7
[1,3] =
51
51
51
27
27
27
27
27
27
[1,4] =
52
53
54
47
48
49
50
51
52
}
将它们放入一个字符串中,datevec 可以被告知如何读取:
dates = num2str([dates{1:4}])
dates =
230915 13 51 52
230915 13 51 53
230915 13 51 54
230918 7 27 47
230918 7 27 48
230918 7 27 49
230918 7 27 50
230918 7 27 51
230918 7 27 52
(上述语法使用大括号
{1:4}
提取单元格内容,并将它们作为逗号分隔的列表放置在 []
括号内以水平连接它们,然后将它们传递给 num2str ,将它们转换为均匀间隔的 char 数组) .
最后,使用我上面提到的语法将其转换为 datevec。该函数会将所有行解析为单独的向量:
dates = datevec (num2str (dates, "yymmdd HH MM SS")
dates =
2023 9 15 13 51 52
2023 9 15 13 51 53
2023 9 15 13 51 54
2023 9 18 7 27 47
2023 9 18 7 27 48
2023 9 18 7 27 49
2023 9 18 7 27 50
2023 9 18 7 27 51
2023 9 18 7 27 52