【问题标题】:MATLAB: how to split cell arrays of different delimiter numbers?MATLAB:如何拆分不同分隔符的单元格数组?
【发布时间】:2017-09-12 18:02:08
【问题描述】:

假设有一个输入单元:

input=

"82.3 4.3 John"

"4.2 0.0001 Tim Taylor"

这是一个 2by1 元胞数组。我需要拆分它以获得一个 2by3 数组,例如:

"82.3" "4.3" "John"

"4.2" "0.0001" "Tim Taylor"

split(input)split(input,'\t') 返回错误,因为每行单元格包含不同数量的分隔符。

【问题讨论】:

  • 单元格中的数据块是由单个制表符 (\t) 分隔还是由可变数量的空格分隔?输入元胞数组是从哪里来的,说不定可以导入数据产生你想要的结果。
  • @Gryphon 它们由单个列表分隔,除了最后一个名称之间有一个空格的列表。我实际上需要消除单个空格并仅按\t 分割。因此,每当xy 之间有一个空格时,两者都应该在单元格中形成一个单独的项目,例如x y
  • strsplit 可能在这里工作,因为它们是字符串
  • @gnovice 有一个很好的答案。需要注意的一件大事是 '\t' 在这里没有被解释为制表符,它被保留为文字。而不是使用 char(9) 你可以做 split(input,compose('\t'))

标签: arrays string matlab split cell-array


【解决方案1】:

你可以使用split,但它会有所不同,具体取决于你是cell array containing character vectors还是包含stringscell array(我知道,它是very confusing):

如果您的input 显示如下:

input =

  2×1 cell array

    '82.3   4.3 John'
    '4.2    0.0001  Tim Taylor'

然后你有一个字符向量元胞数组,你可以像这样在标签上拆分:

str = split(input, char(9))

str = 

  2×3 string array

    "82.3"    "4.3"       "John"      
    "4.2"     "0.0001"    "Tim Taylor"


如果您的 input 改为这样显示:

input =

  2×1 cell array

    ["82.3  4.3 John"      ]
    ["4.2   0.0001  Tim Taylor"]

然后你有一个字符串的单元格数组,你需要将单元格连接成一个 2×1 的字符串数组,然后再在选项卡处拆分:

str = split([input{:}].', char(9))

str = 

  2×3 string array

    "82.3"    "4.3"       "John"      
    "4.2"     "0.0001"    "Tim Taylor"


请注意,我必须使用 char(9) 来指定 ASCII 制表符,并且每种情况下的输出都是一个 2×3 字符串数组。

【讨论】:

  • 简单而完整的答案!请注意,split 函数相对较新,如果您想让您的代码适用于早期的 matlab,可以考虑这样做。
【解决方案2】:

有几种方法可以做到这一点

%Never remembered how to correctly insert whitespace characters
inp = {['82.3' char(9) '4.3' char(9) 'John'];['4.2' char(9) '0.0001' char(9) 'Tim Taylor']}
  1. 正如@Ander Biguri 建议的那样,使用 strsplit

    out=cellfun(@(x) strsplit(x,'\t'), inp,'un',0); out=cat(1,out{:})
    
  2. 带有一些文件导入功能,即带有 textscan

    %with on-the-fly type conversion
    out = cellfun(@(x) textscan(x,'%f%f%s','delimiter','\t'), inp, 'un', 0); out = cat(1,out{:})
    %keeping all values as strings
    out = cellfun(@(x) textscan(x,'%s%s%s','delimiter','\t'), inp, 'un', 0); out = cat(1,out{:})
    

【讨论】:

    【解决方案3】:

    这并不漂亮,但它确实有效:

    clear output % make sure not exist
    for i = 1:size(input,1)
        output(i,:) = cellstr(regexp(input{i}, '\t', 'split'));
    end
    
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    • 1970-01-01
    • 1970-01-01
    • 2017-05-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多