Matlab 从文本文件生成多行和多列的单元格数组
我有一个如下格式的文本文件:Matlab 从文本文件生成多行和多列的单元格数组,matlab,text-processing,cell-array,Matlab,Text Processing,Cell Array,我有一个如下格式的文本文件: ab cd ef gh ij ab cd ef gh ij ab cd ef gh ij >> C = [C{:}] C = 'ab' 'cd' 'ef' 'gh' 'ij' 'ab' 'cd' 'ef' 'gh' 'ij' 'ab' 'cd' 'ef' 'gh' 'ij' 如何将此数据导入Matlab,以便将其存储为与此3x5单元阵列等效的单元阵列:
ab cd ef gh ij
ab cd ef gh ij
ab cd ef gh ij
>> C = [C{:}]
C =
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
如何将此数据导入Matlab,以便将其存储为与此3x5单元阵列等效的单元阵列
:
C = {
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
['ab'], ['cd'], ['ef'], ['gh'], ['ij'];
};
如果需要,我可以修改文本文件以包含某种“行结束”指示器。我尝试使用textscan
,但不知道如何使其按所述格式化变量
编辑:更改已接受的答案;我喜欢处理Divakar答案中可能丢失的数据点。看看这是否适合您-
c1 = cellfun(@(x) strsplit(x),importdata(textfile_path),'un',0);
C = vertcat(c1{:})
这基本上是将文本数据读入一个单元格数组,该数组通过strsplit
将数据拆分为单元格,其余的只是重新排列数据以获得所需的输出
您可以在那里使用regexp
而不是strsplit-
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'
使用textscan
的两种方法
通过以下方式水平连接textscan
的输出:
看起来像这样:
ab cd ef gh ij
ab cd ef gh ij
ab cd ef gh ij
>> C = [C{:}]
C =
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
通过textscan
的'CollectOutput'
选项收集输出:
>> C = textscan(fid,'%s %s %s %s %s','CollectOutput',true), fclose(fid);
C =
{3x5 cell}
>> C = C{1}
C =
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
'ab' 'cd' 'ef' 'gh' 'ij'
总有一天我会学习导入数据。使用fopen
和fclose
真的很老了。@chappjc它很短,很简单,最好不要弄乱分隔符。但是对于生活在过去的人来说,像我自己:),类似于printf
的格式说明符是如此自然。+1不需要cellfun
regexp
处理单元格数组。因此,您可以使用c1=regexp(importdata(textfile_path),'\s','split')代码>