我有一个很大的文本文件,里面有一些标题和数字数据。我想忽略标题行,专门输出第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单元格的输出
发布于 2013-08-30 23:00:26
试试这个:
FID = fopen('datafile.dat');
data = textscan(FID,'%f %f %f %f', 'headerLines', 6);
fclose(FID);data将是一个1x4的单元阵列。每个单元格将包含一个3x1的双精度值数组,这些值是数据的每列中的值。
您可以通过执行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时,它都会从“停止”的地方重新开始。在本例中,前三次调用textscan将返回数据文件中的一行(以包含4x1列数据的单元格的形式)。第四次调用返回一个空单元格。对于你描述的用例,这种格式不是特别有用。
顶部给出的示例应该以一种更容易处理的格式返回数据,以满足您试图完成的任务。在这种情况下,它将匹配每行数据中的四个浮点值,并将继续每行文本,直到它不再匹配此模式。
https://stackoverflow.com/questions/18534680
复制相似问题