0

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

4

1 回答 1

1

尝试这个:

FID = fopen('datafile.dat');
data = textscan(FID,'%f %f %f %f', 'headerLines', 6);
fclose(FID);

data将是一个 1x4 单元阵列。每个单元格将包含一个 3x1 的双精度值数组,它们是数据每列中的值。

您可以通过执行data{2}和访问数据的第 2 列和第 4 列data{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 的前 3 次它会从您的数据文件中返回一行(以包含 4x1数据的单元格的形式)。第四个调用返回一个空单元格。对于您描述的用例,这种格式并不是特别有用。

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

于 2013-08-30T15:00:25.797 回答