我有一个带有一些标题和数字数据的大文本文件。我想忽略标题行,并专门输出第2列和第4列中的数据。
示例数据
[headers]
line1
line2
line3
[data]
1 2 3 4
5 6 7 8
9 10 11 12
我尝试使用以下代码:
FID = fopen('datafile.dat');
data = textscan(FID,'%f',4,'delimiter',' ','headerLines',4);
fclose(FID);
我只得到输出0x1 cell
答案 0 :(得分:1)
试试这个:
FID = fopen('datafile.dat');
data = textscan(FID,'%f %f %f %f', 'headerLines', 6);
fclose(FID);
data
将是1x4单元阵列。每个单元格将包含一个3x1的double值数组,它是数据每列中的值。
您可以执行data{2}
和data{4}
来访问数据的第2和第4列。
使用原始代码时,主要问题是数据文件有 6 标题行,但您已指定只有 4 。
此外,您将遇到与formatSpec匹配的次数规范的问题。以下面的代码为例
data = textscan(FID,'%f',4);
指定您将尝试匹配浮点值4次。请注意,匹配4个值后,textscan
将停止。因此,为了简单起见,让我们假设您的数据文件只包含数据(即没有标题行),那么在执行该代码时会多次获得以下结果:
>> FID = fopen('datafile_noheaders.dat');
>> data_line1 = textscan(FID,'%f', 4)
data_line1 =
[4x1 double]
>> data_line1{1}'
ans =
1 2 3 4
>> data_line2 = textscan(FID,'%f', 4)
data_line2 =
[4x1 double]
>> data_line2{1}'
ans =
5 6 7 8
>> data_line3 = textscan(FID,'%f', 4)
data_line3 =
[4x1 double]
>> data_line3{1}'
ans =
9 10 11 12
>> data_line4 = textscan(FID,'%f', 4)
data_line4 =
[0x1 double]
>> fclose(FID);
请注意,文本可以在每次调用时从“停止”处获取。在这种情况下,前三次调用textscan会从数据文件中返回一行(以包含4x1 列数据的单元格的形式)。第四个调用返回一个空单元格。对于您描述的用例,此格式不是特别有用。
顶部给出的示例应该以一种更容易使用的格式返回数据,以实现您要完成的任务。在这种情况下,它将匹配每行数据中的四个浮点值,并将继续每行文本,直到它不再匹配此模式。