我正在尝试访问由测量设备生成的文本文件中的数字数据。文件是字符串和数字的混合,项目由制表符分隔。它不是矩形的,这使其不适用于matlab的文件加载功能,例如dlmread。我可以将文件转换为exel电子表格,并使用xlsread加载它们,但是由于我要处理数百个文件,因此这不是我的选择。
这些文件如下所示:
Heading String
Commenttext
X Axis Trace A Trace B
Frequency Funct Ch1 Funct Ch2
Frequency / Hz Funct Ch1 / dBr Funct Ch2 / dBV
Hz dBr dBV
LOG LIN LIN
100 -60.35 -71.1446
10000 -7.48178 -12.0321
VOID VOID VOID
VOID VOID VOID
Scan #-5 Labeltext Labeltext
Hz V V
1.000000000000e+003 3.999999910593e-002 1.000000000000e+000
A-X/37 A-Y A-LimLow A-LimUpp A-RefY in V B-X/37 B-Y B-LimLow B-LimUpp B-RefY in V
1.000000000000e+002 -4.873095199691e+001 VOID VOID 3.999999910593e-002 1.000000000000e+002 -2.026775796775e+001 VOID VOID 1.000000000000e+000
1.172102297533e+002 -4.492478734843e+001 VOID VOID 3.999999910593e-002 1.172102297533e+002 -2.024411835772e+001 VOID VOID 1.000000000000e+000
1.373823795883e+002 -3.994765661259e+001 VOID VOID 3.999999910593e-002 1.373823795883e+002 -2.022767912575e+001 VOID VOID 1.000000000000e+000
1.610262027561e+002 -3.628116388971e+001 VOID VOID 3.999999910593e-002 1.610262027561e+002 -2.021939551014e+001 VOID VOID 1.000000000000e+000
1.887391822135e+002 -3.285059881019e+001 VOID VOID 3.999999910593e-002 1.887391822135e+002 -2.021928320409e+001 VOID VOID 1.000000000000e+000
2.212216291070e+002 -2.987476652701e+001 VOID VOID 3.999999910593e-002 2.212216291070e+002 -2.022570411546e+001 VOID VOID 1.000000000000e+000
2.500000000000e+002 -2.751190343935e+001 VOID VOID 3.999999910593e-002 2.500000000000e+002 -2.023346726318e+001 VOID VOID 1.000000000000e+000
2.592943797405e+002 -2.728162367715e+001 VOID VOID 3.999999910593e-002 2.592943797405e+002 -2.023601503648e+001 VOID VOID 1.000000000000e+000
等等
请注意:-扫描#-5前面的值告诉我文件中有多少重复-AX / 37告诉我每次扫描有多少行。-如果适用,“ VOID”元素将替换为实际数字,反之亦然。
我希望能够提取存在的值,并且我的脚本不依赖于迹线的大小,重复次数或值是数字还是“ VOID”。
到目前为止,根据其他方面的技巧,我已经能够创建一个包含文件行的数组,并提取出每行的前两个数字,如下所示:
fid=fopen('data.txt');
Rows = textscan(fid,'%s', 'delimiter','\n'); %Creates a temporary array with the rows of the file
fclose(fid);
TraceStarts=strfind(Rows{1,1},'Scan'); %Looks for the start of each trace..
TracesIdx = find(~cellfun('isempty', TraceStarts)); %.. and stores the indexes.
Traces= cellfun(@(x) textscan(x,'%f','delimiter','\t', 'CollectOutput',1), Rows{1,1});
然后,“迹线”是一个包含每行数组的单元格,每行最多包含两个第一个数字。为什么它发现2后就停止连续搜索浮动项,这对我来说还是个谜...我不想在每一行中指定数字和字符串的顺序,因为它们可能会有所不同。
任何帮助将非常感激。
textscan
由于VOID
元素,您仅报告了两个元素。只需告诉textscan将其视为“空”,即可将其读取为NaN。请参阅textscan文档TreatAsEmpty
中的“名称/值”对。
>> str = '1.000000000000e+002 -4.873095199691e+001 VOID VOID 3.999999910593e-002 1.000000000000e+002 -2.026775796775e+001 VOID VOID 1.000000000000e+000';
>> textscan(str,'%f','delimiter','\t', 'CollectOutput',1)
ans =
[2x1 double]
>> textscan(str,'%f','delimiter','\t', 'CollectOutput',1,'treatAsEmpty',{'VOID'})
ans =
[10x1 double]
>> ans{1}
ans =
100
-48.73095199691
NaN
NaN
0.03999999910593
100
-20.26775796775
NaN
NaN
1
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句