从文本文件中提取特定数据

时间:2017-08-15 19:32:39

标签: regex matlab text cell-array

我有一个txt文件出现在notepad ++中,如下所示:

/a/apple 1
/b/bat 10
/c/cat 22
/d/dog 33
/h/human/female 34

现在我想在结束前的数字之前的第二次斜杠之后提取所有内容。所以我想要的输出是:

out = {'apple'; 'bat'; 'cat'; 'dog'; 'human/female'}

我写了这段代码:

file= fopen('file.txt');
out=  textscan(file,'%s','Delimiter','\n');
fclose(file);

它给出了:

out =
   {365×1 cell}

out{1} = 

    '/a/apple 1'
    '/b/bat 10'
    '/c/cat 22'
    '/d/dog 33'
    '/h/human/female 34'

如何从文本文件中获取所需的输出(如果可能,直接)?或者如果不能直接获得所需的输出,任何正则表达式?

3 个答案:

答案 0 :(得分:4)

您可以直接从textscan获得所需的输出,无需任何进一步处理:

file = fopen('file.txt');
out = textscan(file, '/%c/%s %d');
fclose(file);
out = out{2}

out =

  5×1 cell array

    'apple'
    'bat'
    'cat'
    'dog'
    'human/female'

请注意,format specifier string中的两个斜杠将被视为要在输出中忽略的文字文本。将在字符串(%s)中捕获任何其他斜杠。此外,由于默认分隔符是空格,因此无需指定delimiter argument,因此尾随数字将作为单独的数值(%d)捕获。

答案 1 :(得分:3)

另一个替代方法是使用已经创建的字符串数组使用regular expressions,但是根据要在每个字符串中搜索的指定输入模式巧妙地提取所需内容在你的单元格数组中。使用MATLAB中的regexp函数执行此操作:

% Your code
file= fopen('file.txt');
out =  textscan(file,'%s','Delimiter','\n');
fclose(file);

% Proposed changes
out = regexp(out{1}, '/\w*/(.+)\s', 'tokens', 'once');
out = [out{:}].';

回想一下,textscan将返回单个元素的单元格数组,因此您需要在使用regexp之前访问第一个元素来解包单元格。  建议的代码所做的是对于单元格数组中的每个字符串,它会搜索相应的组合:

  1. / - 首先查找开头的正斜杠

  2. \w*/ - 然后查找字母或数字字符 - 在遇到另一个斜杠之前至少查找其中一个字符。这样做的好处是在第一次斜杠后不仅限于一个字符。它们可以是字母数字的任何字符。

  3. (.+) - 指定,在第二个斜杠之后,我们会收集空格之前的所有字符(请参阅下一点)。我们寻找所有字符而不仅仅是字母数字的原因是因为有可能会出现更多的斜线。我们只有在遇到空格时才停止搜索(再次参见下一点)。

  4. \s - 寻找空间

  5. 它将搜索这个特定的字符集合,这实际上是遇到空格之前的文本。请注意,我必须在组(.+)之后用空格分隔,否则它将基本上在第二个斜线后返回整行。你需要在那里限制字符串中的搜索。

    第3点中的()很重要,因为'tokens'中的regexp属性允许您另外提取位于组中的字符串。使用'once'仅提取第一个匹配项。请注意,输出将是单元格的嵌套单元格数组,其中每个单元格是表示组内匹配的一个元素。我们可以使用comma-separated lists解压缩单元格并将它们连接成单个单元格数组。我们进行转置,以便保持您想要的柱形矢量。

    执行此操作时,我们会收到以下信息:

    >> out
    
    out =
    
      5×1 cell array
    
        'apple'
        'bat'
        'cat'
        'dog'
        'human/female'
    

    但是,我认为您对内容而不是数据的形状更感兴趣,因此如果您愿意,可以删除转置。这种方法的好处是cellfun不需要regexp隐式循环。

答案 2 :(得分:1)

你快到了。

except Exception