【问题标题】:reading text data with multiple headings in matlab在matlab中读取具有多个标题的文本数据
【发布时间】:2014-03-24 16:09:44
【问题描述】:

我正在尝试在 matlab 中读取一个文本文件,该文件的数据存储如下:

x1 x2 y
1 2 5
2 4 7
3 2 1
...
x1 x2 y
5 6 8
2 9 0
3 6 7
...
x1 x2 y
-1 4 3.5
6.4 3.6 3
3 6 7.4
...

如果我多次重复列标题,我将如何在 matlab 中阅读此内容?我尝试使用 importdata 但它只读取第一个标题和与第一个标题关联的数据。

感谢您的帮助!

【问题讨论】:

  • 一个选项是使用xlsread。 Matlab 不是特别擅长读取混合格式的文本和数字文件,格式不是:一行标题,然后是数字。
  • xlsread 不适用于文本文件。我尝试过这个。谢谢!
  • 对了,我忘了说你需要先用excel把它们转换成.xls文件。繁琐...
  • 是的,很遗憾我只能处理文本。我有很多需要批处理的文件。无法手动将每个转换为 excel!
  • 明白了。请参阅我的答案的较新版本,我使用您的示例文件进行了尝试,并且有效。

标签: matlab


【解决方案1】:

这是一个想法,有点笨拙但有效:

用行创建一个临时数组:

fid=fopen('YourFile.txt');
Rows = textscan(fid,'%s', 'delimiter','\n');
fclose(fid);

通过检测x 字符来查找每个数据集的开头:

DataStarts=strfind(Rows{1,1},'x'); 
DataIdx = find(~cellfun('isempty', DataStarts)); 

现在您可以使用DataIdx 中索引之间的间隔提取行。

Columns= cellfun(@(x) textscan(x,'%f','delimiter','\t','CollectOutput',1), Rows{1,1});
Columns= cellfun(@transpose, Columns, 'UniformOutput', 0);

for j=1:size(DataIdx)-1
        Data{j}=cell2mat(Columns(DataIdx(j)+1:DataIdx(j+1)-1));
end
Data{j+1}=cell2mat(Columns(DataIdx(size(DataIdx))+1:size(Rows{1,1})));

各个数据集现在存储在元胞数组Data中。

Data = 

    [3x3 double]    [3x3 double]    [3x3 double]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-24
    • 2016-12-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多