【问题标题】:skip reading headers in MATLAB跳过阅读 MATLAB 中的标题
【发布时间】:2011-02-04 23:48:35
【问题描述】:

我也有类似的问题。但我现在正在尝试将 .txt 格式的文件读入 MATLAB。我的问题是标题。很多时候,由于错误,系统会重写文件中间的标题,然后 MATLAB 无法读取该文件。有没有办法跳过它?我知道如果我知道字符是什么,我可以跳过阅读某些字符。

这是我正在使用的代码。

[c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data');     
file=[pathc c];    
data= dlmread(file, ',', 1,4);    

这样我让用户选择文件。我的文件通常很大 [86400 125] 所以自然它有 125 个头字段或更多取决于文件。

谢谢

因为文件太大,我无法复制,但格式类似于

  day      time    col1    col2 col3 col4 ...............................
  2/3/2010  0:10    3.4    4.5   5.6  4.4 ...............................   
..................................................................    
..................................................................   

等等

【问题讨论】:

  • 你能举一个文件的例子吗?

标签: matlab file-io


【解决方案1】:

使用DLMREAD,您只能读取数字数据。它不会读取日期和时间,因为您的前两列包含。如果其他数据都是数字,您可以告诉 DLMREAD 跳过右侧的第一行和 2 列:

data = dlmread(file, ' ', 1,2); 

要导入日期和时间,您可以使用 IMPORTDATA 而不是 DLMREAD:

A = importdata(file, ' ', 1);
dt = datenum(A.textdata(2:end,1),'mm/dd/yyyy');
tm = datenum(A.textdata(2:end,2),'HH:MM');
data = A.data;

日期和时间将转换为序列号。您可以使用DATESTR 函数将它们转换回来。

【讨论】:

  • 对于上述问题,我只是在寻找一种方法让 matlab 读取我的文件。就像您在上面的代码中看到的那样,我正在跳过标题。我想知道如果matlab在中间遇到标题行agian,是否有办法不停止阅读。例如第 1000 行左右的标题(现在我不知道它是哪一行,除非我运行)谢谢
  • 这就是为什么我要一个例子。在乔纳斯的回答中使用 textscan。
【解决方案2】:

事实证明,您仍然可以使用 textscan。除了您将所有内容都读取为字符串。然后,您尝试转换为双精度。 'str2double' 为字符串返回 NaN,并且由于标题都是字符串,因此您可以将标题行标识为包含所有 NaN 的行。

例如:

%# find and open file
[c,pathc]=uigetfile({'*.txt'},'Select the data','V:\data'); 
file=[pathc c];
fid = fopen(file);

%# read all text
strData = textscan(fid,'%s%s%s%s%s%s','Delimiter',','); 

%# close the file again
fclose(fid);

%# catenate, b/c textscan returns a column of cells for each column in the data
strData = cat(2,strData{:}); 

%# convert cols 3:6 to double
doubleData = str2double(strData(:,3:end));

%# find header rows. headerRows is a logical array
headerRowsL = all(isnan(doubleData),2);

%# since I guess you know what the headers are, you can just remove the header rows
dateAndTimeCell = strData(~headerRowsL,1:2);
dataArray = doubleData(~headerRowsL,:);

%# and you're ready to start working with your data 

【讨论】:

  • 你不需要为 str2double 使用 cellfun。只需doubleData=str2double(strData); 即可。
  • 检查 uigetfile 和 textscan 行中的引号。
  • 糟糕,感谢您发现错误,@yuk。另外,感谢您指出 str2double 在没有 cellfun 的情况下也可以工作。我学到了一些新东西。
  • @Jonas:愚蠢的问题......这是我的矩阵数据?像之前一样,它是具有所有价值的数据。另一个主要问题。它的内存不足,所以我什至无法运行它,我知道我的文件很大,大约 60mb
  • @Paul: dataArray 包含数字数据, dateAndTimeCell 包含日期和时间的相应字符串。我有点惊讶你应该用 60mb 的文件耗尽内存。也许用strData 替换dateAndTimeCell 和用doubleData 替换dataArray 会有所帮助(在这种情况下,数字数据将是doubleData)。另外,您在尝试该功能之前是否运行过clear classes?您是否使用dbstop if error 并在 RAM 用完时使用memory 检查数组的大小和可用内存?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-07-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-27
  • 1970-01-01
相关资源
最近更新 更多