我正在尝试加载以下dataset:
阿富汗,5,1,648,16,10,2,0,3,5,1,1,0,1,1,1,0,绿色,0,0,0,0,1,0,0 ,1,0,0,黑色,绿色
阿尔巴尼亚,3,1,29,3,6,6,0,0,3,1,0,0,1,0,1,0,红色,0,0,0,0,1,0 ,0,0,1,0,红色,红色
阿尔及利亚,4,1,2388,20,8,2,2,0,3,1,1,0,0,1,0,0,绿色,0,0,0,0,1,1 ,0,0,0,0,绿,白
...
问题是它包含整数和字符串。 我找到了一些关于如何只取出整数的信息。 但是还没有看到是否有任何方法可以获得所有数据。
我的问题是可能吗?
如果那是不可能的,那么有没有办法找到每一行的数字并扔掉其他所有而不必选择列?
我特别需要,因为我似乎不能一次在整行上使用str2num
。
答案 0 :(得分:6)
几乎任何事情都有可能,你只需准确定义目标。
假设您的数据库存储为文本文件,您可以使用textread
逐行解析,然后应用regexp
仅过滤数字字段(这不需要事先了解关于列):
C = textread('database.txt', '%s', 'delimiter', '\n');
C = cellfun(@(x)regexp(x, '\d+', 'match'), C, 'Uniform', false);
此处的结果是字符串单元格数组的单元格数组,其中每个字符串对应于特定行中的数字字段。
由于数字仍然存储为字符串,因此您可能需要将它们转换为实际数值。有很多方法可以做到这一点,但你可以用一种棘手的方式使用str2num
:它可以将定界字符串转换为数字数组。这意味着如果您将特定行中的所有字符串连接回一个字符串,并在其间放置空格,则可以同时对所有字符串应用str2num
,如下所示:
C = cellfun(@(x)str2num(sprintf('%s ', x{:})), C, 'Uniform', false);
结果C
是向量的单元格数组,每个向量包含相应行中所有数字字段的值。要访问特定向量,可以使用花括号({}
)。例如,要访问第二行的编号,您可以使用C{2}
。
当然,在解析过程中会丢弃所有非数字字段。如果你想保留它们,你应该使用regexp
的不同正则表达式。