File io 正在八度音阶中使用textscan()。。。如何正确格式化?
我在磁盘上有一个数据集,我正在逐行读取,我想将其中一列数据转换为浮点向量(范围为0-23.99999)(那天) 数据如下所示:File io 正在八度音阶中使用textscan()。。。如何正确格式化?,file-io,formatting,octave,numeric,File Io,Formatting,Octave,Numeric,我在磁盘上有一个数据集,我正在逐行读取,我想将其中一列数据转换为浮点向量(范围为0-23.99999)(那天) 数据如下所示: 2010/01/01,00:00:00.979131, 27.4485, 51.9362, 14.8, 6 2010/01/01,00:00:01.021977, 27.5149, 51.9375, 16.0, 6 2010/01/01,00:00:01.074032, 27.4797, 51.9446, 14.5, 10 2010/01/01,00:00:0
2010/01/01,00:00:00.979131, 27.4485, 51.9362, 14.8, 6
2010/01/01,00:00:01.021977, 27.5149, 51.9375, 16.0, 6
2010/01/01,00:00:01.074032, 27.4797, 51.9446, 14.5, 10
2010/01/01,00:00:01.663689, 25.8441,-152.8141, 14.6, 6
2010/01/01,00:00:01.639541, 25.8744,-152.6122, 1.5, 5
2010/01/01,00:00:02.232099, -2.2447, 11.5023, 18.8, 6
2010/01/01,00:00:02.256351, -0.8135, 27.3139, 17.7, 5
2010/01/01,00:00:02.306734, -2.7797, 28.5109, 26.0, 5
2010/01/01,00:00:02.620765, 25.6656,-154.2029, 26.2, 9
2010/01/01,00:00:02.658495, 25.6698,-154.2157, 23.0, 6
2010/01/01,00:00:02.731266, -5.7106, 126.4517, 3.6, 5
2010/01/01,00:00:02.787495, -5.7138, 126.5210, 24.4, 8
2010/01/01,00:00:02.811636, -3.2453, 124.6919, 21.1, 8
第2列(例如,00:00:00.979131)是我感兴趣的,我想做如下事情
setenv GNUTERM 'x11';
fid = fopen('myfile.txt', 'r');
m = textscan(fid, '%d%d%d%d/%d%d/%d%d, %d%d:%d%d:%d%f, %f, %f, %f, %d');
mx = m(:, 5); %here, I would expect to grab 14.8, 16.0, etc
my = m(:, 2) / 24.0; %here, all data from timestamp column (00:00:00.979131, for ex)
plot(mx, my);
问题是我传递给textscan
的字符串对于我的数据格式不正确。
该数字的格式为“小时:分钟:秒”,单位为军用时间。
如何访问/转换VAR的值mx
,或my
谢谢,
jml看起来您可以执行以下操作:
m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');
…这虽然有效,但它将我想要的时间格式变量放入变量的多个部分。总比没有好。如果有人对以后如何连接这些变量有什么建议,我想读更多。谢谢 看起来您可以执行以下操作:
m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');
…这虽然有效,但它将我想要的时间格式变量放入变量的多个部分。总比没有好。如果有人对以后如何连接这些变量有什么建议,我想读更多。谢谢 文本扫描的输出是一个单元格数组。如果您在回答中使用该命令:
m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');
然后得到14.9,16.0,14.5的垂直矢量:
MyNinthField = m{9};
MyNinthField =
14.8000
16.0000
14.5000
14.6000
1.5000
18.8000
17.7000
26.0000
26.2000
23.0000
3.6000
24.4000
21.1000
然后,要获取时间戳(从一天开始的秒数):
因为m{6}
已经是double
,所以不需要double
。然而,m{4}
和m{5}
都是int32
要以秒为单位计算一天的时间,您只需:
TimeOfDayInSeconds = 3600*Hours+60*Minutes+Seconds;
TimeOfDayInSeconds =
0.97913
1.02198
1.07403
1.66369
1.63954
2.23210
2.25635
2.30673
2.62077
2.65849
2.73127
2.78749
2.81164
如果不进行从int32
到double
的类型转换,则倍频程会将值截断为整数。然而,MATLAB甚至不允许整数和双数组之间的和
希望这有帮助。文本扫描的输出是一个单元格数组。如果您在回答中使用该命令:
m = textscan(fid, '%d/%d/%d %d:%d:%f %f %f %f %d', 'delimiter', ',');
然后得到14.9,16.0,14.5的垂直矢量:
MyNinthField = m{9};
MyNinthField =
14.8000
16.0000
14.5000
14.6000
1.5000
18.8000
17.7000
26.0000
26.2000
23.0000
3.6000
24.4000
21.1000
然后,要获取时间戳(从一天开始的秒数):
因为m{6}
已经是double
,所以不需要double
。然而,m{4}
和m{5}
都是int32
要以秒为单位计算一天的时间,您只需:
TimeOfDayInSeconds = 3600*Hours+60*Minutes+Seconds;
TimeOfDayInSeconds =
0.97913
1.02198
1.07403
1.66369
1.63954
2.23210
2.25635
2.30673
2.62077
2.65849
2.73127
2.78749
2.81164
如果不进行从int32
到double
的类型转换,则倍频程会将值截断为整数。然而,MATLAB甚至不允许整数和双数组之间的和
希望这有帮助。
csvread
不适合此任务。试试textscan
OK,我更新了我的代码和问题。使用/r/t textscan()的输入时我做错了什么?我还尝试了“%d/%d/%d,%d:%d:%f,%f,%f,%f,%d”,但没有成功。csvread
不适合此任务。试试textscan
OK,我更新了我的代码和问题。我在使用/r/t textscan()的输入时做错了什么?我还尝试了“%d/%d/%d,%d:%d:%f,%f,%f,%f,%d”,但没有成功。