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')