从文本文件生成多行和多列的单元格数组

时间:2014-10-31 19:40:23

标签: matlab text-processing cell-array

我有一个格式如下的文本文件:

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的回答中处理可能缺少的数据点。

2 个答案:

答案 0 :(得分:3)

看看这是否适合你 -

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'

答案 1 :(得分:3)

使用textscan的两种方式。

  1. 通过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'
    
  2. 通过textscan的{​​{1}}选项收集输出:

    'CollectOutput'