首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Matlab中使用textscan输出数据

在Matlab中使用textscan输出数据
EN

Stack Overflow用户
提问于 2013-08-30 21:55:24
回答 1查看 464关注 0票数 0

我有一个很大的文本文件,里面有一些标题和数字数据。我想忽略标题行,专门输出第2列和第4列中的数据。

示例数据

代码语言:javascript
复制
[headers]  
line1  
line2  
line3

[data]  
1 2 3 4  
5 6 7 8  
9 10 11 12

我试过使用下面的代码:

代码语言:javascript
复制
FID = fopen('datafile.dat');  
data = textscan(FID,'%f',4,'delimiter',' ','headerLines',4);  
fclose(FID);

我只能得到0x1单元格的输出

EN

回答 1

Stack Overflow用户

发布于 2013-08-30 23:00:26

试试这个:

代码语言:javascript
复制
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将停止。因此,为了简单起见,让我们假设您的数据文件只包含数据(即没有标题行),那么当多次执行该代码时,您将得到以下结果:

代码语言:javascript
复制
>> 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列数据的单元格的形式)。第四次调用返回一个空单元格。对于你描述的用例,这种格式不是特别有用。

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18534680

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档