在Matlab中使用textscan输出数据

时间:2013-08-30 13:55:24

标签: matlab textscan

我有一个带有一些标题和数字数据的大文本文件。我想忽略标题行,并专门输出第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

1 个答案:

答案 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 数据的单元格的形式)。第四个调用返回一个空单元格。对于您描述的用例,此格式不是特别有用。

顶部给出的示例应该以一种更容易使用的格式返回数据,以实现您要完成的任务。在这种情况下,它将匹配每行数据中的四个浮点值,并将继续每行文本,直到它不再匹配此模式。