【问题标题】:Append data to new cell arrays using Token使用 Token 将数据附加到新元胞数组
【发布时间】:2013-06-01 07:23:28
【问题描述】:

我有一个我无法解决的问题。我有一组按行显示的数据(通常是按句子数量组织的文本)

我的句子中的文本示例:

1. Hello, world, It, is, beautiful, to, see, you, all
2. ,Wishing, you, happy, day, ahead 

我正在使用 strtok

    [token remain] = strtok(remain, ', ');

%             token = strtrim(token);
            CellArray {NumberOFCells} = token(1:end) ;  
            NumberOFCells= NumberOFCells+1;

我正在使用 CellArray 将 Token 存储到单元格中,但是我的代码所做的是将第一句话放入单元格中,一旦它迭代到第二个句子,它就会删除预先分配的单元格,因此它会替换它用第二句的记号。

预期输出

  [ nxn ] [ nxn    ] [  ] [ ]   [       ]   [     ] [   ] [  ]  [       ] ...... 
    'Hello' 'world' 'It' 'is' 'beautiful' 'to' see' 'you' 'all' 'Wishing' 'you' 'happy' 'day' 'ahead' 

问题是如何在不清除预填充单元格的情况下将第二句字符串附加到单元格中。

谢谢你,期待与matlab程序员专家见面

我的代码..忽略注释行...检索到的基本上是这种形式。

[Index,Retrieved] = system(['wn ' keyword   type  ]);

    Retrieved;
    arrowSymbol = ' => ';
    CommaSymbol= ', '
    NumberOfSense= 'Sense '; 

    % let's look for the lines with '=> ' only?
     senses = regexp(Retrieved, [arrowSymbol '[\w, ]*\n '], 'match');
     SplitIntoCell = regexp(senses, [CommaSymbol '[\w, ]*\n'], 'match');

   % now, we take out the '=> ' symbol
    for i = 1:size(senses, 2)

        senses{i} = senses{i}(size(arrowSymbol,2):end);
        SplitIntoCell{i}= SplitIntoCell{i}(size(CommaSymbol,2): end);
%         SeperateCells= senses ([1:2 ; end-1:end]);
%         SplitCellContentIntoSingleRows{i}= strtok (SeperateCells, ['\n' ])
        numberCommas = size(regexp(senses{i}, CommaSymbol), 2);

        remain = senses{i};
        RestWord= SplitIntoCell{i};
        NumberOFCells=1;
        for j = 2:numberCommas + 1 + 1 % 1 for a word after last comma and 1 because starts at index 2

%             RemoveCellComma= regexp (Conversion,',');

%            CellArray = [CellArray strsplit(remain, ', ')];
%            [str,~] = regexp(remain,'[^, \t]+', 'match', 'split');
%            CellArray = [CellArray str];

%              [token remain] = strtok(remain, ', ');
%              token = strtrim(token);
%              CellArray {NumberOFCells} = token(1:end) ;  
%              
% %              CellArray =[CellArray strsplit(remain, ', ')]
%              [str, ~]= regexp(remain,'[^, \t]+', 'match', 'split');
%              CellArray = [CellArray str];
%              NumberOFCells= NumberOFCells+1;

            [token remain] = strtok(remain, ', ');
            token = strtrim(token);
            CellArray {NumberOFCells} = token;   
            NumberOFCells= NumberOFCells+1;

检索到=

cat, true cat
       => feline, felid
           => carnivore
               => placental, placental mammal, eutherian, eutherian mammal
                   => mammal, mammalian
                       => vertebrate, craniate
                           => chordate
                               => animal, animate being, beast, brute, creature, fauna
                                   => organism, being
                                       => living thing, animate thing
                                           => object, physical object
                                               => physical entity
                                                   => entity

【问题讨论】:

  • 您能否说明您想要达到的目标(所需的最终结果)?
  • @EitanT 我已经更新了我的问题。在预期的输出中。我想将这两个句子存储在单元格中,而不是存储第一个,然后将其擦除并用新的替换它
  • 那么,简单来说,您想将所有句子分成单词并将所有单词存储在一个单元格数组中吗? [nxn] 是什么意思?您的原始句子是如何存储的?
  • 是的,正确,将所有句子分成单词并将每个单词存储在一个单元格数组中,而不是将所有单词都存储在一个单元格数组中
  • 所以你最终会得到一个由元胞数组组成的元胞数组,对吧?

标签: arrays string matlab append cells


【解决方案1】:

您的问题有点令人困惑,但是阅读它(和其他 cmets)几次,我想我明白您在问什么。

Eitan T 对此使用正则表达式是正确的,当涉及到元胞数组时,请注意使用 [] 和 {} 进行索引/连接的差异:请参阅 Combining Cell Arrays。假设您使用循环遍历每个句子,您可以执行以下操作:

CellArray = [CellArray strsplit(next_sentence, ', ')];

使用regexp(或不区分大小写的替代regexpi),尝试添加'split'作为另一个函数选项,例如:

[str,~] = regexp(next_sentence,'[^, \t]+', 'match', 'split');
CellArray = [CellArray str];

【讨论】:

  • CellArray = [CellArray strsplit(next_sentence, ', ')];你能向我解释一下什么是 CellArray。在里面 []。您是否建议我不需要使用 strtoke ?在我的情况下,下一个句子是指包含下一个句子的下一个单元格你能解释一下吗
  • 这是您的令牌的单元格数组。例如,如果 CellArray = {'cat','dog'} 最初,我做 CellArray = [CellArray 'horse'],其中 'horse' 是 strsplit 函数的输出,CellArray 现在将是 {'cat','dog' ,'马'}。阅读我上面链接的“组合单元阵列”。
  • 是的,但是在这里我从执行上面未定义函数“strsplit”的代码中得到的结果,用于输入“char”类型的参数。
  • 你能用更多的逐字 MATLAB 代码编辑你上面的问题吗?也可以试试 regexp 答案,但是用这么少的代码很难帮助您解决问题。
猜你喜欢
  • 2018-04-26
  • 2011-07-15
  • 1970-01-01
  • 2021-08-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多