我有一个格式如下的文本文件:
ab cd ef gh ij
ab cd ef gh ij
ab cd ef gh ij
如何将此数据导入Matlab,以便将其存储为cell array
,相当于此3x5 cell array
:
C = {
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
};
如果需要,我可以修改文本文件以包含某种“行尾”指示符。我尝试使用textscan
,但无法弄清楚如何使其格式化变量,如上所述。
编辑:改变了接受的答案;我喜欢在Divakar的回答中处理可能缺少的数据点。
答案 0 :(得分:3)
看看这是否适合你 -
c1 = cellfun(@(x) strsplit(x),importdata(textfile_path),'un',0);
C = vertcat(c1{:})
这基本上将文本数据读入一个单元数组,该数组运行strsplit
以将数据拆分为单元格,其余只是重新排列数据以获得所需的输出。
您可以使用regexp
-
c1 = regexp(importdata(textfile_path),'\s','split'); %// As suggested by Luis!
假设您有一个“不规则”形状的文本文件,也就是说,尾随位置的列中缺少某些数据,类似这样 -
ab cd ef gh ij
ab ry mf pp
ab ui rt ko bw
在这种情况下,您可以使用早期代码的修改版本 -
c1 = cellfun(@(x) strsplit(x),importdata(textfile_path),'un',0);
lens = cellfun('length',c1);
C = cell(max(lens),numel(c1));
C(bsxfun(@le,[1:max(lens)]',lens')) = [c1{:}];
C = C'
输出保持提交到2D结构,为空位保留空单元 -
C =
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'ry' 'mf' 'pp' []
'ab' 'ui' 'rt' 'ko' 'bw'
答案 1 :(得分:3)
使用textscan
的两种方式。
通过comma-separated list水平连接textscan
的输出:
fid = fopen('testdat.dat');
C = textscan(fid,'%s %s %s %s %s'); fclose(fid);
C = [C{:}]
看起来像这样:
>> C = [C{:}]
C =
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
通过textscan
的{{1}}选项收集输出:
'CollectOutput'